brintos

brintos / llvm-project-archived public Read only

0
0
Text · 37.6 KiB · fb36ba7 Raw
564 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _2// RUN: %clang_cc1 -verify -fopenmp -fopenmp-targets=x86_64-pc-linux-gnu  \3// RUN:  -x c++ -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - \4// RUN:   | FileCheck %s5 6// expected-no-diagnostics7 8 9class A {10protected:11  int X;12  int Y;13 14public:15  A (int x, int y) : X { x }, Y { y } { };16};17 18class B : public A {19  using A::X;20  using A::Y;21public:22  int res;23  B (int x, int y) : A(x,y), res{0} {}24  void run (void) {25  #pragma omp target26     res = X + Y;27  }28};29 30template<typename T>31struct descriptor32{33  T *A;34  T *C;35  T *C_ref;36  unsigned M;37  unsigned K;38  unsigned N;39};40 41class BASE42{43};44 45//template<typename T>46class C : public BASE47{48public:49  void bar (descriptor<float> &d)50  {51     auto Asize = d.M * d.K;52     auto Csize = d.M * d.N;53     #pragma omp target data map(to:d.A[0:Asize]) map(from:d.C[0:Csize])54     {55       #pragma omp target teams firstprivate(Csize)56       for (int i = 0; i < Csize; ++i)57          d.C[i] = 1;58     }59     #pragma omp target map(from:d.C[0:Csize])60       for (int i = 0; i < Csize; ++i)61          d.C[i] = 1;62   }63};64 65void foo() {66  B b(2, 3);67  b.run();68  C c;69  descriptor<float> d;70  c.bar(d);71}72 73// CHECK-LABEL: define {{[^@]+}}@_Z3foov74// CHECK-SAME: () #[[ATTR0:[0-9]+]] {75// CHECK-NEXT:  entry:76// CHECK-NEXT:    [[B:%.*]] = alloca [[CLASS_B:%.*]], align 477// CHECK-NEXT:    [[C:%.*]] = alloca [[CLASS_C:%.*]], align 178// CHECK-NEXT:    [[D:%.*]] = alloca [[STRUCT_DESCRIPTOR:%.*]], align 879// CHECK-NEXT:    call void @_ZN1BC1Eii(ptr noundef nonnull align 4 dereferenceable(12) [[B]], i32 noundef 2, i32 noundef 3)80// CHECK-NEXT:    call void @_ZN1B3runEv(ptr noundef nonnull align 4 dereferenceable(12) [[B]])81// CHECK-NEXT:    call void @_ZN1C3barER10descriptorIfE(ptr noundef nonnull align 1 dereferenceable(1) [[C]], ptr noundef nonnull align 8 dereferenceable(40) [[D]])82// CHECK-NEXT:    ret void83//84//85// CHECK-LABEL: define {{[^@]+}}@_ZN1BC1Eii86// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {87// CHECK-NEXT:  entry:88// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 889// CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 490// CHECK-NEXT:    [[Y_ADDR:%.*]] = alloca i32, align 491// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 892// CHECK-NEXT:    store i32 [[X]], ptr [[X_ADDR]], align 493// CHECK-NEXT:    store i32 [[Y]], ptr [[Y_ADDR]], align 494// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 895// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 496// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 497// CHECK-NEXT:    call void @_ZN1BC2Eii(ptr noundef nonnull align 4 dereferenceable(12) [[THIS1]], i32 noundef [[TMP0]], i32 noundef [[TMP1]])98// CHECK-NEXT:    ret void99//100//101// CHECK-LABEL: define {{[^@]+}}@_ZN1B3runEv102// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {103// CHECK-NEXT:  entry:104// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8105// CHECK-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 8106// CHECK-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 8107// CHECK-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 8108// CHECK-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8109// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8110// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8111// CHECK-NEXT:    [[RES:%.*]] = getelementptr inbounds nuw [[CLASS_B:%.*]], ptr [[THIS1]], i32 0, i32 1112// CHECK-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[CLASS_A:%.*]], ptr [[THIS1]], i32 0, i32 0113// CHECK-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[CLASS_A]], ptr [[THIS1]], i32 0, i32 1114// CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0115// CHECK-NEXT:    store ptr [[THIS1]], ptr [[TMP0]], align 8116// CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0117// CHECK-NEXT:    store ptr [[THIS1]], ptr [[TMP1]], align 8118// CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0119// CHECK-NEXT:    store ptr null, ptr [[TMP2]], align 8120// CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1121// CHECK-NEXT:    store ptr [[THIS1]], ptr [[TMP3]], align 8122// CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1123// CHECK-NEXT:    store ptr [[RES]], ptr [[TMP4]], align 8124// CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1125// CHECK-NEXT:    store ptr null, ptr [[TMP5]], align 8126// CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2127// CHECK-NEXT:    store ptr [[THIS1]], ptr [[TMP6]], align 8128// CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2129// CHECK-NEXT:    store ptr [[X]], ptr [[TMP7]], align 8130// CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2131// CHECK-NEXT:    store ptr null, ptr [[TMP8]], align 8132// CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3133// CHECK-NEXT:    store ptr [[THIS1]], ptr [[TMP9]], align 8134// CHECK-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 3135// CHECK-NEXT:    store ptr [[Y]], ptr [[TMP10]], align 8136// CHECK-NEXT:    [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3137// CHECK-NEXT:    store ptr null, ptr [[TMP11]], align 8138// CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0139// CHECK-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0140// CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0141// CHECK-NEXT:    store i32 3, ptr [[TMP14]], align 4142// CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1143// CHECK-NEXT:    store i32 4, ptr [[TMP15]], align 4144// CHECK-NEXT:    [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2145// CHECK-NEXT:    store ptr [[TMP12]], ptr [[TMP16]], align 8146// CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3147// CHECK-NEXT:    store ptr [[TMP13]], ptr [[TMP17]], align 8148// CHECK-NEXT:    [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4149// CHECK-NEXT:    store ptr @.offload_sizes, ptr [[TMP18]], align 8150// CHECK-NEXT:    [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5151// CHECK-NEXT:    store ptr @.offload_maptypes, ptr [[TMP19]], align 8152// CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6153// CHECK-NEXT:    store ptr null, ptr [[TMP20]], align 8154// CHECK-NEXT:    [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7155// CHECK-NEXT:    store ptr null, ptr [[TMP21]], align 8156// CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8157// CHECK-NEXT:    store i64 0, ptr [[TMP22]], align 8158// CHECK-NEXT:    [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9159// CHECK-NEXT:    store i64 0, ptr [[TMP23]], align 8160// CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10161// CHECK-NEXT:    store [3 x i32] [i32 -1, i32 0, i32 0], ptr [[TMP24]], align 4162// CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11163// CHECK-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP25]], align 4164// CHECK-NEXT:    [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12165// CHECK-NEXT:    store i32 0, ptr [[TMP26]], align 4166// CHECK-NEXT:    [[TMP27:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB1:[0-9]+]], i64 -1, i32 -1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1B3runEv_l25.region_id, ptr [[KERNEL_ARGS]])167// CHECK-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0168// CHECK-NEXT:    br i1 [[TMP28]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]169// CHECK:       omp_offload.failed:170// CHECK-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1B3runEv_l25(ptr [[THIS1]]) #[[ATTR2:[0-9]+]]171// CHECK-NEXT:    br label [[OMP_OFFLOAD_CONT]]172// CHECK:       omp_offload.cont:173// CHECK-NEXT:    ret void174//175//176// CHECK-LABEL: define {{[^@]+}}@_ZN1C3barER10descriptorIfE177// CHECK-SAME: (ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]], ptr noundef nonnull align 8 dereferenceable(40) [[D:%.*]]) #[[ATTR0]] comdat align 2 {178// CHECK-NEXT:  entry:179// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8180// CHECK-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8181// CHECK-NEXT:    [[ASIZE:%.*]] = alloca i32, align 4182// CHECK-NEXT:    [[CSIZE:%.*]] = alloca i32, align 4183// CHECK-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 8184// CHECK-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 8185// CHECK-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 8186// CHECK-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8187// CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8188// CHECK-NEXT:    [[_TMP8:%.*]] = alloca ptr, align 8189// CHECK-NEXT:    [[CSIZE_CASTED:%.*]] = alloca i64, align 8190// CHECK-NEXT:    [[DOTOFFLOAD_BASEPTRS9:%.*]] = alloca [2 x ptr], align 8191// CHECK-NEXT:    [[DOTOFFLOAD_PTRS10:%.*]] = alloca [2 x ptr], align 8192// CHECK-NEXT:    [[DOTOFFLOAD_MAPPERS11:%.*]] = alloca [2 x ptr], align 8193// CHECK-NEXT:    [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8194// CHECK-NEXT:    [[_TMP12:%.*]] = alloca ptr, align 8195// CHECK-NEXT:    [[CSIZE_CASTED13:%.*]] = alloca i64, align 8196// CHECK-NEXT:    [[DOTOFFLOAD_BASEPTRS18:%.*]] = alloca [3 x ptr], align 8197// CHECK-NEXT:    [[DOTOFFLOAD_PTRS19:%.*]] = alloca [3 x ptr], align 8198// CHECK-NEXT:    [[DOTOFFLOAD_MAPPERS20:%.*]] = alloca [3 x ptr], align 8199// CHECK-NEXT:    [[DOTOFFLOAD_SIZES21:%.*]] = alloca [3 x i64], align 8200// CHECK-NEXT:    [[KERNEL_ARGS22:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8201// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8202// CHECK-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8203// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8204// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8205// CHECK-NEXT:    [[M:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR:%.*]], ptr [[TMP0]], i32 0, i32 3206// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[M]], align 8207// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[D_ADDR]], align 8208// CHECK-NEXT:    [[K:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP2]], i32 0, i32 4209// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[K]], align 4210// CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[TMP1]], [[TMP3]]211// CHECK-NEXT:    store i32 [[MUL]], ptr [[ASIZE]], align 4212// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[D_ADDR]], align 8213// CHECK-NEXT:    [[M2:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP4]], i32 0, i32 3214// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[M2]], align 8215// CHECK-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[D_ADDR]], align 8216// CHECK-NEXT:    [[N:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP6]], i32 0, i32 5217// CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[N]], align 8218// CHECK-NEXT:    [[MUL3:%.*]] = mul i32 [[TMP5]], [[TMP7]]219// CHECK-NEXT:    store i32 [[MUL3]], ptr [[CSIZE]], align 4220// CHECK-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[D_ADDR]], align 8221// CHECK-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[D_ADDR]], align 8222// CHECK-NEXT:    [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP9]], i32 0, i32 0223// CHECK-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[D_ADDR]], align 8224// CHECK-NEXT:    [[A4:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP10]], i32 0, i32 0225// CHECK-NEXT:    [[TMP11:%.*]] = load ptr, ptr [[A4]], align 8226// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw float, ptr [[TMP11]], i64 0227// CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr [[ASIZE]], align 4228// CHECK-NEXT:    [[CONV:%.*]] = zext i32 [[TMP12]] to i64229// CHECK-NEXT:    [[TMP13:%.*]] = mul nuw i64 [[CONV]], 4230// CHECK-NEXT:    [[TMP14:%.*]] = load ptr, ptr [[D_ADDR]], align 8231// CHECK-NEXT:    [[TMP15:%.*]] = load ptr, ptr [[D_ADDR]], align 8232// CHECK-NEXT:    [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP15]], i32 0, i32 1233// CHECK-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[D_ADDR]], align 8234// CHECK-NEXT:    [[C5:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP16]], i32 0, i32 1235// CHECK-NEXT:    [[TMP17:%.*]] = load ptr, ptr [[C5]], align 8236// CHECK-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds nuw float, ptr [[TMP17]], i64 0237// CHECK-NEXT:    [[TMP18:%.*]] = load i32, ptr [[CSIZE]], align 4238// CHECK-NEXT:    [[CONV7:%.*]] = zext i32 [[TMP18]] to i64239// CHECK-NEXT:    [[TMP19:%.*]] = mul nuw i64 [[CONV7]], 4240// CHECK-NEXT:    [[TMP20:%.*]] = getelementptr ptr, ptr [[C]], i32 1241// CHECK-NEXT:    [[TMP21:%.*]] = ptrtoint ptr [[TMP20]] to i64242// CHECK-NEXT:    [[TMP22:%.*]] = ptrtoint ptr [[A]] to i64243// CHECK-NEXT:    [[TMP23:%.*]] = sub i64 [[TMP21]], [[TMP22]]244// CHECK-NEXT:    [[TMP24:%.*]] = sdiv exact i64 [[TMP23]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)245// CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0246// CHECK-NEXT:    store ptr [[TMP8]], ptr [[TMP25]], align 8247// CHECK-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0248// CHECK-NEXT:    store ptr [[A]], ptr [[TMP26]], align 8249// CHECK-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 0250// CHECK-NEXT:    store i64 [[TMP24]], ptr [[TMP27]], align 8251// CHECK-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0252// CHECK-NEXT:    store ptr null, ptr [[TMP28]], align 8253// CHECK-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1254// CHECK-NEXT:    store ptr [[A]], ptr [[TMP29]], align 8255// CHECK-NEXT:    [[TMP30:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1256// CHECK-NEXT:    store ptr [[ARRAYIDX]], ptr [[TMP30]], align 8257// CHECK-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 1258// CHECK-NEXT:    store i64 [[TMP13]], ptr [[TMP31]], align 8259// CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1260// CHECK-NEXT:    store ptr null, ptr [[TMP32]], align 8261// CHECK-NEXT:    [[TMP33:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2262// CHECK-NEXT:    store ptr [[C]], ptr [[TMP33]], align 8263// CHECK-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2264// CHECK-NEXT:    store ptr [[ARRAYIDX6]], ptr [[TMP34]], align 8265// CHECK-NEXT:    [[TMP35:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 2266// CHECK-NEXT:    store i64 [[TMP19]], ptr [[TMP35]], align 8267// CHECK-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2268// CHECK-NEXT:    store ptr null, ptr [[TMP36]], align 8269// CHECK-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0270// CHECK-NEXT:    [[TMP38:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0271// CHECK-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 0272// CHECK-NEXT:    call void @__tgt_target_data_begin_mapper(ptr @[[GLOB1]], i64 -1, i32 3, ptr [[TMP37]], ptr [[TMP38]], ptr [[TMP39]], ptr @.offload_maptypes.1, ptr null, ptr null)273// CHECK-NEXT:    [[TMP40:%.*]] = load ptr, ptr [[D_ADDR]], align 8274// CHECK-NEXT:    store ptr [[TMP40]], ptr [[TMP]], align 8275// CHECK-NEXT:    [[TMP41:%.*]] = load ptr, ptr [[TMP]], align 8276// CHECK-NEXT:    store ptr [[TMP41]], ptr [[_TMP8]], align 8277// CHECK-NEXT:    [[TMP42:%.*]] = load i32, ptr [[CSIZE]], align 4278// CHECK-NEXT:    store i32 [[TMP42]], ptr [[CSIZE_CASTED]], align 4279// CHECK-NEXT:    [[TMP43:%.*]] = load i64, ptr [[CSIZE_CASTED]], align 8280// CHECK-NEXT:    [[TMP44:%.*]] = load ptr, ptr [[_TMP8]], align 8281// CHECK-NEXT:    [[TMP45:%.*]] = load ptr, ptr [[_TMP8]], align 8282// CHECK-NEXT:    [[TMP46:%.*]] = load ptr, ptr [[_TMP8]], align 8283// CHECK-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS9]], i32 0, i32 0284// CHECK-NEXT:    store i64 [[TMP43]], ptr [[TMP47]], align 8285// CHECK-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS10]], i32 0, i32 0286// CHECK-NEXT:    store i64 [[TMP43]], ptr [[TMP48]], align 8287// CHECK-NEXT:    [[TMP49:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_MAPPERS11]], i64 0, i64 0288// CHECK-NEXT:    store ptr null, ptr [[TMP49]], align 8289// CHECK-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS9]], i32 0, i32 1290// CHECK-NEXT:    store ptr [[TMP45]], ptr [[TMP50]], align 8291// CHECK-NEXT:    [[TMP51:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS10]], i32 0, i32 1292// CHECK-NEXT:    store ptr [[TMP46]], ptr [[TMP51]], align 8293// CHECK-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_MAPPERS11]], i64 0, i64 1294// CHECK-NEXT:    store ptr null, ptr [[TMP52]], align 8295// CHECK-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS9]], i32 0, i32 0296// CHECK-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS10]], i32 0, i32 0297// CHECK-NEXT:    [[TMP55:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0298// CHECK-NEXT:    store i32 3, ptr [[TMP55]], align 4299// CHECK-NEXT:    [[TMP56:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1300// CHECK-NEXT:    store i32 2, ptr [[TMP56]], align 4301// CHECK-NEXT:    [[TMP57:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2302// CHECK-NEXT:    store ptr [[TMP53]], ptr [[TMP57]], align 8303// CHECK-NEXT:    [[TMP58:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3304// CHECK-NEXT:    store ptr [[TMP54]], ptr [[TMP58]], align 8305// CHECK-NEXT:    [[TMP59:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4306// CHECK-NEXT:    store ptr @.offload_sizes.2, ptr [[TMP59]], align 8307// CHECK-NEXT:    [[TMP60:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5308// CHECK-NEXT:    store ptr @.offload_maptypes.3, ptr [[TMP60]], align 8309// CHECK-NEXT:    [[TMP61:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6310// CHECK-NEXT:    store ptr null, ptr [[TMP61]], align 8311// CHECK-NEXT:    [[TMP62:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7312// CHECK-NEXT:    store ptr null, ptr [[TMP62]], align 8313// CHECK-NEXT:    [[TMP63:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8314// CHECK-NEXT:    store i64 0, ptr [[TMP63]], align 8315// CHECK-NEXT:    [[TMP64:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9316// CHECK-NEXT:    store i64 0, ptr [[TMP64]], align 8317// CHECK-NEXT:    [[TMP65:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10318// CHECK-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP65]], align 4319// CHECK-NEXT:    [[TMP66:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11320// CHECK-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP66]], align 4321// CHECK-NEXT:    [[TMP67:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12322// CHECK-NEXT:    store i32 0, ptr [[TMP67]], align 4323// CHECK-NEXT:    [[TMP68:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB1]], i64 -1, i32 0, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l55.region_id, ptr [[KERNEL_ARGS]])324// CHECK-NEXT:    [[TMP69:%.*]] = icmp ne i32 [[TMP68]], 0325// CHECK-NEXT:    br i1 [[TMP69]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]326// CHECK:       omp_offload.failed:327// CHECK-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l55(i64 [[TMP43]], ptr [[TMP44]]) #[[ATTR2]]328// CHECK-NEXT:    br label [[OMP_OFFLOAD_CONT]]329// CHECK:       omp_offload.cont:330// CHECK-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0331// CHECK-NEXT:    [[TMP71:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0332// CHECK-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 0333// CHECK-NEXT:    call void @__tgt_target_data_end_mapper(ptr @[[GLOB1]], i64 -1, i32 3, ptr [[TMP70]], ptr [[TMP71]], ptr [[TMP72]], ptr @.offload_maptypes.1, ptr null, ptr null)334// CHECK-NEXT:    [[TMP73:%.*]] = load ptr, ptr [[D_ADDR]], align 8335// CHECK-NEXT:    store ptr [[TMP73]], ptr [[_TMP12]], align 8336// CHECK-NEXT:    [[TMP74:%.*]] = load i32, ptr [[CSIZE]], align 4337// CHECK-NEXT:    store i32 [[TMP74]], ptr [[CSIZE_CASTED13]], align 4338// CHECK-NEXT:    [[TMP75:%.*]] = load i64, ptr [[CSIZE_CASTED13]], align 8339// CHECK-NEXT:    [[TMP76:%.*]] = load ptr, ptr [[_TMP12]], align 8340// CHECK-NEXT:    [[TMP77:%.*]] = load ptr, ptr [[_TMP12]], align 8341// CHECK-NEXT:    [[TMP78:%.*]] = load ptr, ptr [[_TMP12]], align 8342// CHECK-NEXT:    [[C14:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP78]], i32 0, i32 1343// CHECK-NEXT:    [[TMP79:%.*]] = load ptr, ptr [[_TMP12]], align 8344// CHECK-NEXT:    [[C15:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR]], ptr [[TMP79]], i32 0, i32 1345// CHECK-NEXT:    [[TMP80:%.*]] = load ptr, ptr [[C15]], align 8346// CHECK-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw float, ptr [[TMP80]], i64 0347// CHECK-NEXT:    [[TMP81:%.*]] = load i32, ptr [[CSIZE]], align 4348// CHECK-NEXT:    [[CONV17:%.*]] = zext i32 [[TMP81]] to i64349// CHECK-NEXT:    [[TMP82:%.*]] = mul nuw i64 [[CONV17]], 4350// CHECK-NEXT:    [[TMP83:%.*]] = getelementptr ptr, ptr [[C14]], i32 1351// CHECK-NEXT:    [[TMP84:%.*]] = ptrtoint ptr [[TMP83]] to i64352// CHECK-NEXT:    [[TMP85:%.*]] = ptrtoint ptr [[C14]] to i64353// CHECK-NEXT:    [[TMP86:%.*]] = sub i64 [[TMP84]], [[TMP85]]354// CHECK-NEXT:    [[TMP87:%.*]] = sdiv exact i64 [[TMP86]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)355// CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DOTOFFLOAD_SIZES21]], ptr align 8 @.offload_sizes.4, i64 24, i1 false)356// CHECK-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0357// CHECK-NEXT:    store i64 [[TMP75]], ptr [[TMP88]], align 8358// CHECK-NEXT:    [[TMP89:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS19]], i32 0, i32 0359// CHECK-NEXT:    store i64 [[TMP75]], ptr [[TMP89]], align 8360// CHECK-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS20]], i64 0, i64 0361// CHECK-NEXT:    store ptr null, ptr [[TMP90]], align 8362// CHECK-NEXT:    [[TMP91:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 1363// CHECK-NEXT:    store ptr [[TMP77]], ptr [[TMP91]], align 8364// CHECK-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS19]], i32 0, i32 1365// CHECK-NEXT:    store ptr [[C14]], ptr [[TMP92]], align 8366// CHECK-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES21]], i32 0, i32 1367// CHECK-NEXT:    store i64 [[TMP87]], ptr [[TMP93]], align 8368// CHECK-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS20]], i64 0, i64 1369// CHECK-NEXT:    store ptr null, ptr [[TMP94]], align 8370// CHECK-NEXT:    [[TMP95:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 2371// CHECK-NEXT:    store ptr [[C14]], ptr [[TMP95]], align 8372// CHECK-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS19]], i32 0, i32 2373// CHECK-NEXT:    store ptr [[ARRAYIDX16]], ptr [[TMP96]], align 8374// CHECK-NEXT:    [[TMP97:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES21]], i32 0, i32 2375// CHECK-NEXT:    store i64 [[TMP82]], ptr [[TMP97]], align 8376// CHECK-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS20]], i64 0, i64 2377// CHECK-NEXT:    store ptr null, ptr [[TMP98]], align 8378// CHECK-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS18]], i32 0, i32 0379// CHECK-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS19]], i32 0, i32 0380// CHECK-NEXT:    [[TMP101:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES21]], i32 0, i32 0381// CHECK-NEXT:    [[TMP102:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 0382// CHECK-NEXT:    store i32 3, ptr [[TMP102]], align 4383// CHECK-NEXT:    [[TMP103:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 1384// CHECK-NEXT:    store i32 3, ptr [[TMP103]], align 4385// CHECK-NEXT:    [[TMP104:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 2386// CHECK-NEXT:    store ptr [[TMP99]], ptr [[TMP104]], align 8387// CHECK-NEXT:    [[TMP105:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 3388// CHECK-NEXT:    store ptr [[TMP100]], ptr [[TMP105]], align 8389// CHECK-NEXT:    [[TMP106:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 4390// CHECK-NEXT:    store ptr [[TMP101]], ptr [[TMP106]], align 8391// CHECK-NEXT:    [[TMP107:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 5392// CHECK-NEXT:    store ptr @.offload_maptypes.5, ptr [[TMP107]], align 8393// CHECK-NEXT:    [[TMP108:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 6394// CHECK-NEXT:    store ptr null, ptr [[TMP108]], align 8395// CHECK-NEXT:    [[TMP109:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 7396// CHECK-NEXT:    store ptr null, ptr [[TMP109]], align 8397// CHECK-NEXT:    [[TMP110:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 8398// CHECK-NEXT:    store i64 0, ptr [[TMP110]], align 8399// CHECK-NEXT:    [[TMP111:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 9400// CHECK-NEXT:    store i64 0, ptr [[TMP111]], align 8401// CHECK-NEXT:    [[TMP112:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 10402// CHECK-NEXT:    store [3 x i32] [i32 -1, i32 0, i32 0], ptr [[TMP112]], align 4403// CHECK-NEXT:    [[TMP113:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 11404// CHECK-NEXT:    store [3 x i32] zeroinitializer, ptr [[TMP113]], align 4405// CHECK-NEXT:    [[TMP114:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS22]], i32 0, i32 12406// CHECK-NEXT:    store i32 0, ptr [[TMP114]], align 4407// CHECK-NEXT:    [[TMP115:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB1]], i64 -1, i32 -1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l59.region_id, ptr [[KERNEL_ARGS22]])408// CHECK-NEXT:    [[TMP116:%.*]] = icmp ne i32 [[TMP115]], 0409// CHECK-NEXT:    br i1 [[TMP116]], label [[OMP_OFFLOAD_FAILED23:%.*]], label [[OMP_OFFLOAD_CONT24:%.*]]410// CHECK:       omp_offload.failed23:411// CHECK-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l59(i64 [[TMP75]], ptr [[TMP76]]) #[[ATTR2]]412// CHECK-NEXT:    br label [[OMP_OFFLOAD_CONT24]]413// CHECK:       omp_offload.cont24:414// CHECK-NEXT:    ret void415//416//417// CHECK-LABEL: define {{[^@]+}}@_ZN1BC2Eii418// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(12) [[THIS:%.*]], i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {419// CHECK-NEXT:  entry:420// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8421// CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 4422// CHECK-NEXT:    [[Y_ADDR:%.*]] = alloca i32, align 4423// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8424// CHECK-NEXT:    store i32 [[X]], ptr [[X_ADDR]], align 4425// CHECK-NEXT:    store i32 [[Y]], ptr [[Y_ADDR]], align 4426// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8427// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4428// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4429// CHECK-NEXT:    call void @_ZN1AC2Eii(ptr noundef nonnull align 4 dereferenceable(8) [[THIS1]], i32 noundef [[TMP0]], i32 noundef [[TMP1]])430// CHECK-NEXT:    [[RES:%.*]] = getelementptr inbounds nuw [[CLASS_B:%.*]], ptr [[THIS1]], i32 0, i32 1431// CHECK-NEXT:    store i32 0, ptr [[RES]], align 4432// CHECK-NEXT:    ret void433//434//435// CHECK-LABEL: define {{[^@]+}}@_ZN1AC2Eii436// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(8) [[THIS:%.*]], i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {437// CHECK-NEXT:  entry:438// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8439// CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 4440// CHECK-NEXT:    [[Y_ADDR:%.*]] = alloca i32, align 4441// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8442// CHECK-NEXT:    store i32 [[X]], ptr [[X_ADDR]], align 4443// CHECK-NEXT:    store i32 [[Y]], ptr [[Y_ADDR]], align 4444// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8445// CHECK-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[CLASS_A:%.*]], ptr [[THIS1]], i32 0, i32 0446// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4447// CHECK-NEXT:    store i32 [[TMP0]], ptr [[X]], align 4448// CHECK-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[CLASS_A]], ptr [[THIS1]], i32 0, i32 1449// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4450// CHECK-NEXT:    store i32 [[TMP1]], ptr [[Y]], align 4451// CHECK-NEXT:    ret void452//453//454// CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1B3runEv_l25455// CHECK-SAME: (ptr noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {456// CHECK-NEXT:  entry:457// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8458// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8459// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8460// CHECK-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[CLASS_A:%.*]], ptr [[TMP0]], i32 0, i32 0461// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[X]], align 4462// CHECK-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[CLASS_A]], ptr [[TMP0]], i32 0, i32 1463// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[Y]], align 4464// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP1]], [[TMP2]]465// CHECK-NEXT:    [[RES:%.*]] = getelementptr inbounds nuw [[CLASS_B:%.*]], ptr [[TMP0]], i32 0, i32 1466// CHECK-NEXT:    store i32 [[ADD]], ptr [[RES]], align 4467// CHECK-NEXT:    ret void468//469//470// CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l55471// CHECK-SAME: (i64 noundef [[CSIZE:%.*]], ptr noundef nonnull align 8 dereferenceable(40) [[D:%.*]]) #[[ATTR1]] {472// CHECK-NEXT:  entry:473// CHECK-NEXT:    [[CSIZE_ADDR:%.*]] = alloca i64, align 8474// CHECK-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8475// CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8476// CHECK-NEXT:    [[CSIZE_CASTED:%.*]] = alloca i64, align 8477// CHECK-NEXT:    store i64 [[CSIZE]], ptr [[CSIZE_ADDR]], align 8478// CHECK-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8479// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8480// CHECK-NEXT:    store ptr [[TMP0]], ptr [[TMP]], align 8481// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[CSIZE_ADDR]], align 4482// CHECK-NEXT:    store i32 [[TMP1]], ptr [[CSIZE_CASTED]], align 4483// CHECK-NEXT:    [[TMP2:%.*]] = load i64, ptr [[CSIZE_CASTED]], align 8484// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8485// CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB1]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l55.omp_outlined, i64 [[TMP2]], ptr [[TMP3]])486// CHECK-NEXT:    ret void487//488//489// CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l55.omp_outlined490// CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[CSIZE:%.*]], ptr noundef nonnull align 8 dereferenceable(40) [[D:%.*]]) #[[ATTR1]] {491// CHECK-NEXT:  entry:492// CHECK-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8493// CHECK-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8494// CHECK-NEXT:    [[CSIZE_ADDR:%.*]] = alloca i64, align 8495// CHECK-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8496// CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8497// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4498// CHECK-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8499// CHECK-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8500// CHECK-NEXT:    store i64 [[CSIZE]], ptr [[CSIZE_ADDR]], align 8501// CHECK-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8502// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8503// CHECK-NEXT:    store ptr [[TMP0]], ptr [[TMP]], align 8504// CHECK-NEXT:    store i32 0, ptr [[I]], align 4505// CHECK-NEXT:    br label [[FOR_COND:%.*]]506// CHECK:       for.cond:507// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[I]], align 4508// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[CSIZE_ADDR]], align 4509// CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[TMP1]], [[TMP2]]510// CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]511// CHECK:       for.body:512// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8513// CHECK-NEXT:    [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR:%.*]], ptr [[TMP3]], i32 0, i32 1514// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[C]], align 8515// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[I]], align 4516// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP5]] to i64517// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[TMP4]], i64 [[IDXPROM]]518// CHECK-NEXT:    store float 1.000000e+00, ptr [[ARRAYIDX]], align 4519// CHECK-NEXT:    br label [[FOR_INC:%.*]]520// CHECK:       for.inc:521// CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[I]], align 4522// CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP6]], 1523// CHECK-NEXT:    store i32 [[INC]], ptr [[I]], align 4524// CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]525// CHECK:       for.end:526// CHECK-NEXT:    ret void527//528//529// CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN1C3barER10descriptorIfE_l59530// CHECK-SAME: (i64 noundef [[CSIZE:%.*]], ptr noundef nonnull align 8 dereferenceable(40) [[D:%.*]]) #[[ATTR1]] {531// CHECK-NEXT:  entry:532// CHECK-NEXT:    [[CSIZE_ADDR:%.*]] = alloca i64, align 8533// CHECK-NEXT:    [[D_ADDR:%.*]] = alloca ptr, align 8534// CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8535// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4536// CHECK-NEXT:    store i64 [[CSIZE]], ptr [[CSIZE_ADDR]], align 8537// CHECK-NEXT:    store ptr [[D]], ptr [[D_ADDR]], align 8538// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[D_ADDR]], align 8539// CHECK-NEXT:    store ptr [[TMP0]], ptr [[TMP]], align 8540// CHECK-NEXT:    store i32 0, ptr [[I]], align 4541// CHECK-NEXT:    br label [[FOR_COND:%.*]]542// CHECK:       for.cond:543// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[I]], align 4544// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[CSIZE_ADDR]], align 4545// CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[TMP1]], [[TMP2]]546// CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]547// CHECK:       for.body:548// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8549// CHECK-NEXT:    [[C:%.*]] = getelementptr inbounds nuw [[STRUCT_DESCRIPTOR:%.*]], ptr [[TMP3]], i32 0, i32 1550// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[C]], align 8551// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[I]], align 4552// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP5]] to i64553// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[TMP4]], i64 [[IDXPROM]]554// CHECK-NEXT:    store float 1.000000e+00, ptr [[ARRAYIDX]], align 4555// CHECK-NEXT:    br label [[FOR_INC:%.*]]556// CHECK:       for.inc:557// CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[I]], align 4558// CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP6]], 1559// CHECK-NEXT:    store i32 [[INC]], ptr [[I]], align 4560// CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP10:![0-9]+]]561// CHECK:       for.end:562// CHECK-NEXT:    ret void563//564