14456 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// Test target codegen - host bc file has to be created first.3// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc4// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck --check-prefixes=CHECK-64 %s5// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc6// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck --check-prefixes=CHECK-32 %s7// RUN: %clang_cc1 -verify -fopenmp -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck --check-prefixes=CHECK-32-EX %s8// expected-no-diagnostics9#ifndef HEADER10#define HEADER11 12int a;13 14void foo() {15#pragma omp target teams distribute parallel for simd if(a)16 for (int i = 0; i < 10; ++i)17 ;18#pragma omp target teams distribute parallel for simd schedule(static)19 for (int i = 0; i < 10; ++i)20 ;21#pragma omp target teams distribute parallel for simd schedule(static, 1)22 for (int i = 0; i < 10; ++i)23 ;24#pragma omp target teams distribute parallel for simd schedule(auto)25 for (int i = 0; i < 10; ++i)26 ;27#pragma omp target teams distribute parallel for simd schedule(runtime)28 for (int i = 0; i < 10; ++i)29 ;30#pragma omp target teams distribute parallel for simd schedule(dynamic)31 for (int i = 0; i < 10; ++i)32 ;33#pragma omp target teams distribute parallel for simd schedule(guided)34 for (int i = 0; i < 10; ++i)35 ;36int a;37#pragma omp target teams distribute parallel for lastprivate(a)38 for (int i = 0; i < 10; ++i)39 a = i;40#pragma omp target teams distribute parallel for schedule(static)41 for (int i = 0; i < 10; ++i)42 ;43#pragma omp target teams distribute parallel for schedule(static, 1)44 for (int i = 0; i < 10; ++i)45 ;46#pragma omp target teams distribute parallel for schedule(auto)47 for (int i = 0; i < 10; ++i)48 ;49#pragma omp target teams distribute parallel for schedule(runtime)50 for (int i = 0; i < 10; ++i)51 ;52#pragma omp target teams distribute parallel for schedule(dynamic)53 for (int i = 0; i < 10; ++i)54 ;55#pragma omp target teams distribute parallel for schedule(guided)56 for (int i = 0; i < 10; ++i)57 ;58#pragma omp target teams59 {60 int b;61#pragma omp distribute parallel for simd62 for (int i = 0; i < 10; ++i)63 ;64 ;65 }66#pragma omp target teams67 {68 int b[] = {2, 3, sizeof(int)};69#pragma omp distribute parallel for simd schedule(static)70 for (int i = 0; i < 10; ++i)71 ;72 }73#pragma omp target teams74 {75 int b;76#pragma omp distribute parallel for simd schedule(static, 1)77 for (int i = 0; i < 10; ++i)78 ;79 int &c = b;80 }81#pragma omp target teams82#pragma omp distribute parallel for simd schedule(auto)83 for (int i = 0; i < 10; ++i)84 ;85#pragma omp target teams86#pragma omp distribute parallel for simd schedule(runtime)87 for (int i = 0; i < 10; ++i)88 ;89#pragma omp target teams90#pragma omp distribute parallel for simd schedule(dynamic)91 for (int i = 0; i < 10; ++i)92 ;93#pragma omp target teams94#pragma omp distribute parallel for simd schedule(guided)95 for (int i = 0; i < 10; ++i)96 ;97#pragma omp target teams98#pragma omp distribute parallel for99 for (int i = 0; i < 10; ++i)100 ;101#pragma omp target teams102#pragma omp distribute parallel for schedule(static)103 for (int i = 0; i < 10; ++i)104 ;105#pragma omp target teams106#pragma omp distribute parallel for schedule(static, 1)107 for (int i = 0; i < 10; ++i)108 ;109#pragma omp target teams110#pragma omp distribute parallel for schedule(auto)111 for (int i = 0; i < 10; ++i)112 ;113#pragma omp target teams114#pragma omp distribute parallel for schedule(runtime)115 for (int i = 0; i < 10; ++i)116 ;117#pragma omp target teams118#pragma omp distribute parallel for schedule(dynamic)119 for (int i = 0; i < 10; ++i)120 ;121#pragma omp target teams122#pragma omp distribute parallel for schedule(guided)123 for (int i = 0; i < 10; ++i)124 ;125#pragma omp target126#pragma omp teams127#pragma omp distribute parallel for128 for (int i = 0; i < 10; ++i)129 ;130#pragma omp target131#pragma omp teams132#pragma omp distribute parallel for schedule(static)133 for (int i = 0; i < 10; ++i)134 ;135#pragma omp target136#pragma omp teams137#pragma omp distribute parallel for schedule(static, 1)138 for (int i = 0; i < 10; ++i)139 ;140#pragma omp target141#pragma omp teams142#pragma omp distribute parallel for schedule(auto)143 for (int i = 0; i < 10; ++i)144 ;145#pragma omp target146#pragma omp teams147#pragma omp distribute parallel for schedule(runtime)148 for (int i = 0; i < 10; ++i)149 ;150#pragma omp target151#pragma omp teams152#pragma omp distribute parallel for schedule(dynamic)153 for (int i = 0; i < 10; ++i)154 ;155#pragma omp target156#pragma omp teams157#pragma omp distribute parallel for schedule(guided)158 for (int i = 0; i < 10; ++i)159 ;160#pragma omp target parallel for if(a)161 for (int i = 0; i < 10; ++i)162 ;163#pragma omp target parallel for schedule(static)164 for (int i = 0; i < 10; ++i)165 ;166#pragma omp target parallel for schedule(static, 1)167 for (int i = 0; i < 10; ++i)168 ;169#pragma omp target parallel for schedule(auto)170 for (int i = 0; i < 10; ++i)171 ;172#pragma omp target parallel for schedule(runtime)173 for (int i = 0; i < 10; ++i)174 ;175#pragma omp target parallel for schedule(dynamic)176 for (int i = 0; i < 10; ++i)177 ;178#pragma omp target parallel for schedule(guided)179 for (int i = 0; i < 10; ++i)180 ;181#pragma omp target parallel if(a)182#pragma omp for simd183 for (int i = 0; i < 10; ++i)184 ;185#pragma omp target parallel186#pragma omp for simd schedule(static)187 for (int i = 0; i < 10; ++i)188 ;189#pragma omp target parallel190#pragma omp for simd schedule(static, 1)191 for (int i = 0; i < 10; ++i)192 ;193#pragma omp target parallel194#pragma omp for simd schedule(auto)195 for (int i = 0; i < 10; ++i)196 ;197#pragma omp target parallel198#pragma omp for simd schedule(runtime)199 for (int i = 0; i < 10; ++i)200 ;201#pragma omp target parallel202#pragma omp for simd schedule(dynamic)203 for (int i = 0; i < 10; ++i)204 ;205#pragma omp target parallel206#pragma omp for simd schedule(guided)207 for (int i = 0; i < 10; ++i)208 ;209#pragma omp target210#pragma omp parallel211#pragma omp for simd ordered212 for (int i = 0; i < 10; ++i)213 ;214#pragma omp target215#pragma omp parallel216#pragma omp for simd schedule(static)217 for (int i = 0; i < 10; ++i)218 ;219#pragma omp target220#pragma omp parallel221#pragma omp for simd schedule(static, 1)222 for (int i = 0; i < 10; ++i)223 ;224#pragma omp target225#pragma omp parallel226#pragma omp for simd schedule(auto)227 for (int i = 0; i < 10; ++i)228 ;229#pragma omp target230#pragma omp parallel231#pragma omp for simd schedule(runtime)232 for (int i = 0; i < 10; ++i)233 ;234#pragma omp target235#pragma omp parallel236#pragma omp for simd schedule(dynamic)237 for (int i = 0; i < 10; ++i)238 ;239#pragma omp target240#pragma omp parallel241#pragma omp for simd schedule(guided)242 for (int i = 0; i < 10; ++i)243 ;244#pragma omp target245#pragma omp parallel for246 for (int i = 0; i < 10; ++i)247 ;248#pragma omp target249#pragma omp parallel for schedule(static)250 for (int i = 0; i < 10; ++i)251 ;252#pragma omp target253#pragma omp parallel for schedule(static, 1)254 for (int i = 0; i < 10; ++i)255 ;256#pragma omp target257#pragma omp parallel for schedule(auto)258 for (int i = 0; i < 10; ++i)259 ;260#pragma omp target261#pragma omp parallel for schedule(runtime)262 for (int i = 0; i < 10; ++i)263 ;264#pragma omp target265#pragma omp parallel for schedule(dynamic)266 for (int i = 0; i < 10; ++i)267 ;268#pragma omp target269#pragma omp parallel for schedule(guided)270 for (int i = 0; i < 10; ++i)271 ;272}273 274#endif275// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15276// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0:[0-9]+]] {277// CHECK-64-NEXT: entry:278// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8279// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8280// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8281// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4282// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4283// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 8284// CHECK-64-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 8285// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_kernel_environment, ptr [[DYN_PTR]])286// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1287// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]288// CHECK-64: user_code.entry:289// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])290// CHECK-64-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1291// CHECK-64-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i1292// CHECK-64-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TOBOOL]] to i8293// CHECK-64-NEXT: store i8 [[FROMBOOL]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 1294// CHECK-64-NEXT: [[TMP3:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR__CASTED]], align 8295// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 4296// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 4297// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], i64 [[TMP3]]) #[[ATTR2:[0-9]+]]298// CHECK-64-NEXT: call void @__kmpc_target_deinit()299// CHECK-64-NEXT: ret void300// CHECK-64: worker.exit:301// CHECK-64-NEXT: ret void302//303//304// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined305// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {306// CHECK-64-NEXT: entry:307// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8308// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8309// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8310// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4311// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 4312// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4313// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4314// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4315// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4316// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 4317// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 8318// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x ptr], align 8319// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__CASTED15:%.*]] = alloca i64, align 8320// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS17:%.*]] = alloca [3 x ptr], align 8321// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8322// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8323// CHECK-64-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 8324// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 4325// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 4326// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4327// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4328// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()329// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8330// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4331// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])332// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4333// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9334// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]335// CHECK-64: cond.true:336// CHECK-64-NEXT: br label [[COND_END:%.*]]337// CHECK-64: cond.false:338// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4339// CHECK-64-NEXT: br label [[COND_END]]340// CHECK-64: cond.end:341// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]342// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4343// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4344// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4345// CHECK-64-NEXT: [[TMP5:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1346// CHECK-64-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP5]] to i1347// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]348// CHECK-64: omp_if.then:349// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]350// CHECK-64: omp.inner.for.cond:351// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221:![0-9]+]]352// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP6]], 10353// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]354// CHECK-64: omp.inner.for.body:355// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]356// CHECK-64-NEXT: [[TMP8:%.*]] = zext i32 [[TMP7]] to i64357// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]358// CHECK-64-NEXT: [[TMP10:%.*]] = zext i32 [[TMP9]] to i64359// CHECK-64-NEXT: [[TMP11:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1, !llvm.access.group [[ACC_GRP221]]360// CHECK-64-NEXT: [[TOBOOL2:%.*]] = trunc i8 [[TMP11]] to i1361// CHECK-64-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TOBOOL2]] to i8362// CHECK-64-NEXT: store i8 [[FROMBOOL]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 1, !llvm.access.group [[ACC_GRP221]]363// CHECK-64-NEXT: [[TMP12:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR__CASTED]], align 8, !llvm.access.group [[ACC_GRP221]]364// CHECK-64-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 0365// CHECK-64-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP8]] to ptr366// CHECK-64-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8, !llvm.access.group [[ACC_GRP221]]367// CHECK-64-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 1368// CHECK-64-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP10]] to ptr369// CHECK-64-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8, !llvm.access.group [[ACC_GRP221]]370// CHECK-64-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 2371// CHECK-64-NEXT: [[TMP18:%.*]] = inttoptr i64 [[TMP12]] to ptr372// CHECK-64-NEXT: store ptr [[TMP18]], ptr [[TMP17]], align 8, !llvm.access.group [[ACC_GRP221]]373// CHECK-64-NEXT: [[TMP19:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1, !llvm.access.group [[ACC_GRP221]]374// CHECK-64-NEXT: [[TOBOOL3:%.*]] = trunc i8 [[TMP19]] to i1375// CHECK-64-NEXT: [[TMP20:%.*]] = zext i1 [[TOBOOL3]] to i32376// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 [[TMP20]], i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 3), !llvm.access.group [[ACC_GRP221]]377// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]378// CHECK-64: omp.inner.for.inc:379// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221]]380// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP221]]381// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]382// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221]]383// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]384// CHECK-64-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP221]]385// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]386// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]387// CHECK-64-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]388// CHECK-64-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP221]]389// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP25]], [[TMP26]]390// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]391// CHECK-64-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]392// CHECK-64-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP27]], 9393// CHECK-64-NEXT: br i1 [[CMP6]], label [[COND_TRUE7:%.*]], label [[COND_FALSE8:%.*]]394// CHECK-64: cond.true7:395// CHECK-64-NEXT: br label [[COND_END9:%.*]]396// CHECK-64: cond.false8:397// CHECK-64-NEXT: [[TMP28:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]398// CHECK-64-NEXT: br label [[COND_END9]]399// CHECK-64: cond.end9:400// CHECK-64-NEXT: [[COND10:%.*]] = phi i32 [ 9, [[COND_TRUE7]] ], [ [[TMP28]], [[COND_FALSE8]] ]401// CHECK-64-NEXT: store i32 [[COND10]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]402// CHECK-64-NEXT: [[TMP29:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]403// CHECK-64-NEXT: store i32 [[TMP29]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221]]404// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP222:![0-9]+]]405// CHECK-64: omp.inner.for.end:406// CHECK-64-NEXT: br label [[OMP_IF_END:%.*]]407// CHECK-64: omp_if.else:408// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND11:%.*]]409// CHECK-64: omp.inner.for.cond11:410// CHECK-64-NEXT: [[TMP30:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4411// CHECK-64-NEXT: [[CMP12:%.*]] = icmp slt i32 [[TMP30]], 10412// CHECK-64-NEXT: br i1 [[CMP12]], label [[OMP_INNER_FOR_BODY13:%.*]], label [[OMP_INNER_FOR_END28:%.*]]413// CHECK-64: omp.inner.for.body13:414// CHECK-64-NEXT: [[TMP31:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4415// CHECK-64-NEXT: [[TMP32:%.*]] = zext i32 [[TMP31]] to i64416// CHECK-64-NEXT: [[TMP33:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4417// CHECK-64-NEXT: [[TMP34:%.*]] = zext i32 [[TMP33]] to i64418// CHECK-64-NEXT: [[TMP35:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1419// CHECK-64-NEXT: [[TOBOOL14:%.*]] = trunc i8 [[TMP35]] to i1420// CHECK-64-NEXT: [[FROMBOOL16:%.*]] = zext i1 [[TOBOOL14]] to i8421// CHECK-64-NEXT: store i8 [[FROMBOOL16]], ptr [[DOTCAPTURE_EXPR__CASTED15]], align 1422// CHECK-64-NEXT: [[TMP36:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR__CASTED15]], align 8423// CHECK-64-NEXT: [[TMP37:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS17]], i64 0, i64 0424// CHECK-64-NEXT: [[TMP38:%.*]] = inttoptr i64 [[TMP32]] to ptr425// CHECK-64-NEXT: store ptr [[TMP38]], ptr [[TMP37]], align 8426// CHECK-64-NEXT: [[TMP39:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS17]], i64 0, i64 1427// CHECK-64-NEXT: [[TMP40:%.*]] = inttoptr i64 [[TMP34]] to ptr428// CHECK-64-NEXT: store ptr [[TMP40]], ptr [[TMP39]], align 8429// CHECK-64-NEXT: [[TMP41:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS17]], i64 0, i64 2430// CHECK-64-NEXT: [[TMP42:%.*]] = inttoptr i64 [[TMP36]] to ptr431// CHECK-64-NEXT: store ptr [[TMP42]], ptr [[TMP41]], align 8432// CHECK-64-NEXT: [[TMP43:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1433// CHECK-64-NEXT: [[TOBOOL18:%.*]] = trunc i8 [[TMP43]] to i1434// CHECK-64-NEXT: [[TMP44:%.*]] = zext i1 [[TOBOOL18]] to i32435// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 [[TMP44]], i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined1, ptr null, ptr [[CAPTURED_VARS_ADDRS17]], i64 3)436// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC19:%.*]]437// CHECK-64: omp.inner.for.inc19:438// CHECK-64-NEXT: [[TMP45:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4439// CHECK-64-NEXT: [[TMP46:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4440// CHECK-64-NEXT: [[ADD20:%.*]] = add nsw i32 [[TMP45]], [[TMP46]]441// CHECK-64-NEXT: store i32 [[ADD20]], ptr [[DOTOMP_IV]], align 4442// CHECK-64-NEXT: [[TMP47:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4443// CHECK-64-NEXT: [[TMP48:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4444// CHECK-64-NEXT: [[ADD21:%.*]] = add nsw i32 [[TMP47]], [[TMP48]]445// CHECK-64-NEXT: store i32 [[ADD21]], ptr [[DOTOMP_COMB_LB]], align 4446// CHECK-64-NEXT: [[TMP49:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4447// CHECK-64-NEXT: [[TMP50:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4448// CHECK-64-NEXT: [[ADD22:%.*]] = add nsw i32 [[TMP49]], [[TMP50]]449// CHECK-64-NEXT: store i32 [[ADD22]], ptr [[DOTOMP_COMB_UB]], align 4450// CHECK-64-NEXT: [[TMP51:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4451// CHECK-64-NEXT: [[CMP23:%.*]] = icmp sgt i32 [[TMP51]], 9452// CHECK-64-NEXT: br i1 [[CMP23]], label [[COND_TRUE24:%.*]], label [[COND_FALSE25:%.*]]453// CHECK-64: cond.true24:454// CHECK-64-NEXT: br label [[COND_END26:%.*]]455// CHECK-64: cond.false25:456// CHECK-64-NEXT: [[TMP52:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4457// CHECK-64-NEXT: br label [[COND_END26]]458// CHECK-64: cond.end26:459// CHECK-64-NEXT: [[COND27:%.*]] = phi i32 [ 9, [[COND_TRUE24]] ], [ [[TMP52]], [[COND_FALSE25]] ]460// CHECK-64-NEXT: store i32 [[COND27]], ptr [[DOTOMP_COMB_UB]], align 4461// CHECK-64-NEXT: [[TMP53:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4462// CHECK-64-NEXT: store i32 [[TMP53]], ptr [[DOTOMP_IV]], align 4463// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND11]], !llvm.loop [[LOOP225:![0-9]+]]464// CHECK-64: omp.inner.for.end28:465// CHECK-64-NEXT: br label [[OMP_IF_END]]466// CHECK-64: omp_if.end:467// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]468// CHECK-64: omp.loop.exit:469// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])470// CHECK-64-NEXT: [[TMP54:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4471// CHECK-64-NEXT: [[TMP55:%.*]] = icmp ne i32 [[TMP54]], 0472// CHECK-64-NEXT: br i1 [[TMP55]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]473// CHECK-64: .omp.final.then:474// CHECK-64-NEXT: store i32 10, ptr [[I]], align 4475// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]476// CHECK-64: .omp.final.done:477// CHECK-64-NEXT: ret void478//479//480// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined481// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {482// CHECK-64-NEXT: entry:483// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8484// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8485// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8486// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8487// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8488// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4489// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 4490// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4491// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4492// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4493// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4494// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 4495// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8496// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8497// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 8498// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 8499// CHECK-64-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 8500// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4501// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4502// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 8503// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i32504// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8505// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32506// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 4507// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 4508// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4509// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4510// CHECK-64-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1511// CHECK-64-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i1512// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]513// CHECK-64: omp_if.then:514// CHECK-64-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8515// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4516// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3:[0-9]+]], i32 [[TMP4]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)517// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4518// CHECK-64-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 4519// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]520// CHECK-64: omp.inner.for.cond:521// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227:![0-9]+]]522// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP6]] to i64523// CHECK-64-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8, !llvm.access.group [[ACC_GRP227]]524// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP7]]525// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]526// CHECK-64: omp.inner.for.body:527// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227]]528// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 1529// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]530// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP227]]531// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]532// CHECK-64: omp.body.continue:533// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]534// CHECK-64: omp.inner.for.inc:535// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227]]536// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP227]]537// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]538// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227]]539// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP228:![0-9]+]]540// CHECK-64: omp.inner.for.end:541// CHECK-64-NEXT: br label [[OMP_IF_END:%.*]]542// CHECK-64: omp_if.else:543// CHECK-64-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8544// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 4545// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP12]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)546// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4547// CHECK-64-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4548// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND4:%.*]]549// CHECK-64: omp.inner.for.cond4:550// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4551// CHECK-64-NEXT: [[CONV5:%.*]] = sext i32 [[TMP14]] to i64552// CHECK-64-NEXT: [[TMP15:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8553// CHECK-64-NEXT: [[CMP6:%.*]] = icmp ule i64 [[CONV5]], [[TMP15]]554// CHECK-64-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY7:%.*]], label [[OMP_INNER_FOR_END13:%.*]]555// CHECK-64: omp.inner.for.body7:556// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4557// CHECK-64-NEXT: [[MUL8:%.*]] = mul nsw i32 [[TMP16]], 1558// CHECK-64-NEXT: [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]559// CHECK-64-NEXT: store i32 [[ADD9]], ptr [[I]], align 4560// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE10:%.*]]561// CHECK-64: omp.body.continue10:562// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC11:%.*]]563// CHECK-64: omp.inner.for.inc11:564// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4565// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4566// CHECK-64-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]567// CHECK-64-NEXT: store i32 [[ADD12]], ptr [[DOTOMP_IV]], align 4568// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND4]], !llvm.loop [[LOOP230:![0-9]+]]569// CHECK-64: omp.inner.for.end13:570// CHECK-64-NEXT: br label [[OMP_IF_END]]571// CHECK-64: omp_if.end:572// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]573// CHECK-64: omp.loop.exit:574// CHECK-64-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8575// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4576// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP20]])577// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4578// CHECK-64-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0579// CHECK-64-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]580// CHECK-64: .omp.final.then:581// CHECK-64-NEXT: store i32 10, ptr [[I]], align 4582// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]583// CHECK-64: .omp.final.done:584// CHECK-64-NEXT: ret void585//586//587// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined1588// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {589// CHECK-64-NEXT: entry:590// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8591// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8592// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8593// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8594// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 8595// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4596// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 4597// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4598// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4599// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4600// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4601// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 4602// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8603// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8604// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 8605// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 8606// CHECK-64-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 8607// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4608// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4609// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 8610// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i32611// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8612// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32613// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 4614// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 4615// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4616// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4617// CHECK-64-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1618// CHECK-64-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i1619// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]620// CHECK-64: omp_if.then:621// CHECK-64-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8622// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4623// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP4]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)624// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4625// CHECK-64-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 4626// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]627// CHECK-64: omp.inner.for.cond:628// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231:![0-9]+]]629// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP6]] to i64630// CHECK-64-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8, !llvm.access.group [[ACC_GRP231]]631// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP7]]632// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]633// CHECK-64: omp.inner.for.body:634// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231]]635// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 1636// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]637// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP231]]638// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]639// CHECK-64: omp.body.continue:640// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]641// CHECK-64: omp.inner.for.inc:642// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231]]643// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP231]]644// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]645// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231]]646// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP232:![0-9]+]]647// CHECK-64: omp.inner.for.end:648// CHECK-64-NEXT: br label [[OMP_IF_END:%.*]]649// CHECK-64: omp_if.else:650// CHECK-64-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8651// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 4652// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP12]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)653// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4654// CHECK-64-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4655// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND4:%.*]]656// CHECK-64: omp.inner.for.cond4:657// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4658// CHECK-64-NEXT: [[CONV5:%.*]] = sext i32 [[TMP14]] to i64659// CHECK-64-NEXT: [[TMP15:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8660// CHECK-64-NEXT: [[CMP6:%.*]] = icmp ule i64 [[CONV5]], [[TMP15]]661// CHECK-64-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY7:%.*]], label [[OMP_INNER_FOR_END13:%.*]]662// CHECK-64: omp.inner.for.body7:663// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4664// CHECK-64-NEXT: [[MUL8:%.*]] = mul nsw i32 [[TMP16]], 1665// CHECK-64-NEXT: [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]666// CHECK-64-NEXT: store i32 [[ADD9]], ptr [[I]], align 4667// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE10:%.*]]668// CHECK-64: omp.body.continue10:669// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC11:%.*]]670// CHECK-64: omp.inner.for.inc11:671// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4672// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4673// CHECK-64-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]674// CHECK-64-NEXT: store i32 [[ADD12]], ptr [[DOTOMP_IV]], align 4675// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND4]], !llvm.loop [[LOOP234:![0-9]+]]676// CHECK-64: omp.inner.for.end13:677// CHECK-64-NEXT: br label [[OMP_IF_END]]678// CHECK-64: omp_if.end:679// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]680// CHECK-64: omp.loop.exit:681// CHECK-64-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8682// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4683// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP20]])684// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4685// CHECK-64-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0686// CHECK-64-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]687// CHECK-64: .omp.final.then:688// CHECK-64-NEXT: store i32 10, ptr [[I]], align 4689// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]690// CHECK-64: .omp.final.done:691// CHECK-64-NEXT: ret void692//693//694// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18695// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {696// CHECK-64-NEXT: entry:697// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8698// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4699// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4700// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 8701// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_kernel_environment, ptr [[DYN_PTR]])702// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1703// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]704// CHECK-64: user_code.entry:705// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])706// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 4707// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 4708// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]709// CHECK-64-NEXT: call void @__kmpc_target_deinit()710// CHECK-64-NEXT: ret void711// CHECK-64: worker.exit:712// CHECK-64-NEXT: ret void713//714//715// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined716// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {717// CHECK-64-NEXT: entry:718// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8719// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8720// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4721// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 4722// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4723// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4724// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4725// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4726// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 4727// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 8728// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8729// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8730// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 4731// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 4732// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4733// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4734// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()735// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8736// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4737// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])738// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4739// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9740// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]741// CHECK-64: cond.true:742// CHECK-64-NEXT: br label [[COND_END:%.*]]743// CHECK-64: cond.false:744// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4745// CHECK-64-NEXT: br label [[COND_END]]746// CHECK-64: cond.end:747// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]748// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4749// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4750// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4751// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]752// CHECK-64: omp.inner.for.cond:753// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235:![0-9]+]]754// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 10755// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]756// CHECK-64: omp.inner.for.body:757// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]758// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i64759// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]760// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i64761// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 0762// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr763// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP235]]764// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 1765// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr766// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP235]]767// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP235]]768// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]769// CHECK-64: omp.inner.for.inc:770// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235]]771// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP235]]772// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]773// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235]]774// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]775// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP235]]776// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]777// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]778// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]779// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP235]]780// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]781// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]782// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]783// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 9784// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]785// CHECK-64: cond.true5:786// CHECK-64-NEXT: br label [[COND_END7:%.*]]787// CHECK-64: cond.false6:788// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]789// CHECK-64-NEXT: br label [[COND_END7]]790// CHECK-64: cond.end7:791// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]792// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]793// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]794// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235]]795// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP236:![0-9]+]]796// CHECK-64: omp.inner.for.end:797// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]798// CHECK-64: omp.loop.exit:799// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])800// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4801// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0802// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]803// CHECK-64: .omp.final.then:804// CHECK-64-NEXT: store i32 10, ptr [[I]], align 4805// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]806// CHECK-64: .omp.final.done:807// CHECK-64-NEXT: ret void808//809//810// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined_omp_outlined811// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {812// CHECK-64-NEXT: entry:813// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8814// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8815// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 8816// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 8817// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4818// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 4819// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4820// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4821// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4822// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4823// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 4824// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8825// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8826// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 8827// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 8828// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4829// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4830// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 8831// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i32832// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8833// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i32834// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 4835// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 4836// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4837// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4838// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8839// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4840// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)841// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4842// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 9843// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]844// CHECK-64: cond.true:845// CHECK-64-NEXT: br label [[COND_END:%.*]]846// CHECK-64: cond.false:847// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4848// CHECK-64-NEXT: br label [[COND_END]]849// CHECK-64: cond.end:850// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]851// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4852// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4853// CHECK-64-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 4854// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]855// CHECK-64: omp.inner.for.cond:856// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238:![0-9]+]]857// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP238]]858// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]859// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]860// CHECK-64: omp.inner.for.body:861// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238]]862// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 1863// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]864// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP238]]865// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]866// CHECK-64: omp.body.continue:867// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]868// CHECK-64: omp.inner.for.inc:869// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238]]870// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 1871// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238]]872// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP239:![0-9]+]]873// CHECK-64: omp.inner.for.end:874// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]875// CHECK-64: omp.loop.exit:876// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])877// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4878// CHECK-64-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0879// CHECK-64-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]880// CHECK-64: .omp.final.then:881// CHECK-64-NEXT: store i32 10, ptr [[I]], align 4882// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]883// CHECK-64: .omp.final.done:884// CHECK-64-NEXT: ret void885//886//887// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21888// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {889// CHECK-64-NEXT: entry:890// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8891// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4892// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4893// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 8894// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_kernel_environment, ptr [[DYN_PTR]])895// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1896// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]897// CHECK-64: user_code.entry:898// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])899// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 4900// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 4901// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]902// CHECK-64-NEXT: call void @__kmpc_target_deinit()903// CHECK-64-NEXT: ret void904// CHECK-64: worker.exit:905// CHECK-64-NEXT: ret void906//907//908// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined909// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {910// CHECK-64-NEXT: entry:911// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8912// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8913// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4914// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 4915// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4916// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4917// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4918// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4919// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 4920// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 8921// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8922// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8923// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 4924// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 4925// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4926// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4927// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()928// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8929// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4930// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])931// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4932// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9933// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]934// CHECK-64: cond.true:935// CHECK-64-NEXT: br label [[COND_END:%.*]]936// CHECK-64: cond.false:937// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4938// CHECK-64-NEXT: br label [[COND_END]]939// CHECK-64: cond.end:940// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]941// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4942// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4943// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4944// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]945// CHECK-64: omp.inner.for.cond:946// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241:![0-9]+]]947// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 10948// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]949// CHECK-64: omp.inner.for.body:950// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]951// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i64952// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]953// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i64954// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 0955// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr956// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP241]]957// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 1958// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr959// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP241]]960// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP241]]961// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]962// CHECK-64: omp.inner.for.inc:963// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241]]964// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP241]]965// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]966// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241]]967// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]968// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP241]]969// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]970// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]971// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]972// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP241]]973// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]974// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]975// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]976// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 9977// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]978// CHECK-64: cond.true5:979// CHECK-64-NEXT: br label [[COND_END7:%.*]]980// CHECK-64: cond.false6:981// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]982// CHECK-64-NEXT: br label [[COND_END7]]983// CHECK-64: cond.end7:984// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]985// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]986// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]987// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241]]988// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP242:![0-9]+]]989// CHECK-64: omp.inner.for.end:990// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]991// CHECK-64: omp.loop.exit:992// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])993// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4994// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 0995// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]996// CHECK-64: .omp.final.then:997// CHECK-64-NEXT: store i32 10, ptr [[I]], align 4998// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]999// CHECK-64: .omp.final.done:1000// CHECK-64-NEXT: ret void1001//1002//1003// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined_omp_outlined1004// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {1005// CHECK-64-NEXT: entry:1006// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81007// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81008// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81009// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81010// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41011// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41012// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41013// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41014// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41015// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41016// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41017// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81018// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81019// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81020// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81021// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41022// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41023// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81024// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i321025// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81026// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i321027// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41028// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 41029// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41030// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41031// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81032// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 41033// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1034// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41035// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41036// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1037// CHECK-64: omp.inner.for.cond:1038// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244:![0-9]+]]1039// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i641040// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8, !llvm.access.group [[ACC_GRP244]]1041// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]1042// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1043// CHECK-64: omp.inner.for.body:1044// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244]]1045// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 11046// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1047// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP244]]1048// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1049// CHECK-64: omp.body.continue:1050// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1051// CHECK-64: omp.inner.for.inc:1052// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244]]1053// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP244]]1054// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]1055// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244]]1056// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP245:![0-9]+]]1057// CHECK-64: omp.inner.for.end:1058// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1059// CHECK-64: omp.loop.exit:1060// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])1061// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41062// CHECK-64-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 01063// CHECK-64-NEXT: br i1 [[TMP11]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1064// CHECK-64: .omp.final.then:1065// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41066// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1067// CHECK-64: .omp.final.done:1068// CHECK-64-NEXT: ret void1069//1070//1071// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l241072// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {1073// CHECK-64-NEXT: entry:1074// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 81075// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41076// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41077// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 81078// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_kernel_environment, ptr [[DYN_PTR]])1079// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11080// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1081// CHECK-64: user_code.entry:1082// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1083// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41084// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 41085// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]1086// CHECK-64-NEXT: call void @__kmpc_target_deinit()1087// CHECK-64-NEXT: ret void1088// CHECK-64: worker.exit:1089// CHECK-64-NEXT: ret void1090//1091//1092// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined1093// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {1094// CHECK-64-NEXT: entry:1095// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81096// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81097// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41098// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41099// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41100// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41101// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41102// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41103// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41104// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 81105// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81106// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81107// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41108// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 41109// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41110// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41111// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()1112// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81113// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41114// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])1115// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41116// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 91117// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1118// CHECK-64: cond.true:1119// CHECK-64-NEXT: br label [[COND_END:%.*]]1120// CHECK-64: cond.false:1121// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41122// CHECK-64-NEXT: br label [[COND_END]]1123// CHECK-64: cond.end:1124// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1125// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41126// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41127// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41128// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1129// CHECK-64: omp.inner.for.cond:1130// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247:![0-9]+]]1131// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 101132// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1133// CHECK-64: omp.inner.for.body:1134// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]1135// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i641136// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]1137// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i641138// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 01139// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr1140// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP247]]1141// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 11142// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr1143// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP247]]1144// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP247]]1145// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1146// CHECK-64: omp.inner.for.inc:1147// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247]]1148// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP247]]1149// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]1150// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247]]1151// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]1152// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP247]]1153// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]1154// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]1155// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]1156// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP247]]1157// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]1158// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]1159// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]1160// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 91161// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]1162// CHECK-64: cond.true5:1163// CHECK-64-NEXT: br label [[COND_END7:%.*]]1164// CHECK-64: cond.false6:1165// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]1166// CHECK-64-NEXT: br label [[COND_END7]]1167// CHECK-64: cond.end7:1168// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]1169// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]1170// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]1171// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247]]1172// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP248:![0-9]+]]1173// CHECK-64: omp.inner.for.end:1174// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1175// CHECK-64: omp.loop.exit:1176// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])1177// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41178// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 01179// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1180// CHECK-64: .omp.final.then:1181// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41182// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1183// CHECK-64: .omp.final.done:1184// CHECK-64-NEXT: ret void1185//1186//1187// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined_omp_outlined1188// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {1189// CHECK-64-NEXT: entry:1190// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81191// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81192// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81193// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81194// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41195// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41196// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41197// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41198// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41199// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41200// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41201// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81202// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81203// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81204// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81205// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41206// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41207// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81208// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i321209// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81210// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i321211// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41212// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 41213// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41214// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41215// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41216// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41217// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81218// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41219// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)1220// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]1221// CHECK-64: omp.dispatch.cond:1222// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])1223// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 01224// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]1225// CHECK-64: omp.dispatch.body:1226// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41227// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 41228// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1229// CHECK-64: omp.inner.for.cond:1230// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250:![0-9]+]]1231// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP250]]1232// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]1233// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1234// CHECK-64: omp.inner.for.body:1235// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250]]1236// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 11237// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1238// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP250]]1239// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1240// CHECK-64: omp.body.continue:1241// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1242// CHECK-64: omp.inner.for.inc:1243// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250]]1244// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 11245// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250]]1246// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP251:![0-9]+]]1247// CHECK-64: omp.inner.for.end:1248// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]1249// CHECK-64: omp.dispatch.inc:1250// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]1251// CHECK-64: omp.dispatch.end:1252// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])1253// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41254// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 01255// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1256// CHECK-64: .omp.final.then:1257// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41258// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1259// CHECK-64: .omp.final.done:1260// CHECK-64-NEXT: ret void1261//1262//1263// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l271264// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {1265// CHECK-64-NEXT: entry:1266// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 81267// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41268// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41269// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 81270// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_kernel_environment, ptr [[DYN_PTR]])1271// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11272// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1273// CHECK-64: user_code.entry:1274// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1275// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41276// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 41277// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]1278// CHECK-64-NEXT: call void @__kmpc_target_deinit()1279// CHECK-64-NEXT: ret void1280// CHECK-64: worker.exit:1281// CHECK-64-NEXT: ret void1282//1283//1284// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined1285// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {1286// CHECK-64-NEXT: entry:1287// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81288// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81289// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41290// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41291// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41292// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41293// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41294// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41295// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41296// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 81297// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81298// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81299// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41300// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 41301// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41302// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41303// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()1304// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81305// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41306// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])1307// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41308// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 91309// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1310// CHECK-64: cond.true:1311// CHECK-64-NEXT: br label [[COND_END:%.*]]1312// CHECK-64: cond.false:1313// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41314// CHECK-64-NEXT: br label [[COND_END]]1315// CHECK-64: cond.end:1316// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1317// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41318// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41319// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41320// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1321// CHECK-64: omp.inner.for.cond:1322// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253:![0-9]+]]1323// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 101324// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1325// CHECK-64: omp.inner.for.body:1326// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]1327// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i641328// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]1329// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i641330// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 01331// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr1332// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP253]]1333// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 11334// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr1335// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP253]]1336// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP253]]1337// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1338// CHECK-64: omp.inner.for.inc:1339// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253]]1340// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP253]]1341// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]1342// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253]]1343// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]1344// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP253]]1345// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]1346// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]1347// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]1348// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP253]]1349// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]1350// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]1351// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]1352// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 91353// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]1354// CHECK-64: cond.true5:1355// CHECK-64-NEXT: br label [[COND_END7:%.*]]1356// CHECK-64: cond.false6:1357// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]1358// CHECK-64-NEXT: br label [[COND_END7]]1359// CHECK-64: cond.end7:1360// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]1361// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]1362// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]1363// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253]]1364// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP254:![0-9]+]]1365// CHECK-64: omp.inner.for.end:1366// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1367// CHECK-64: omp.loop.exit:1368// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])1369// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41370// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 01371// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1372// CHECK-64: .omp.final.then:1373// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41374// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1375// CHECK-64: .omp.final.done:1376// CHECK-64-NEXT: ret void1377//1378//1379// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined_omp_outlined1380// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {1381// CHECK-64-NEXT: entry:1382// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81383// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81384// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81385// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81386// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41387// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41388// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41389// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41390// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41391// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41392// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41393// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81394// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81395// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81396// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81397// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41398// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41399// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81400// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i321401// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81402// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i321403// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41404// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 41405// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41406// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41407// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41408// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41409// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81410// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41411// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)1412// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]1413// CHECK-64: omp.dispatch.cond:1414// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])1415// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 01416// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]1417// CHECK-64: omp.dispatch.body:1418// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41419// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 41420// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1421// CHECK-64: omp.inner.for.cond:1422// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256:![0-9]+]]1423// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP256]]1424// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]1425// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1426// CHECK-64: omp.inner.for.body:1427// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256]]1428// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 11429// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1430// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP256]]1431// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1432// CHECK-64: omp.body.continue:1433// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1434// CHECK-64: omp.inner.for.inc:1435// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256]]1436// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 11437// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256]]1438// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP257:![0-9]+]]1439// CHECK-64: omp.inner.for.end:1440// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]1441// CHECK-64: omp.dispatch.inc:1442// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]1443// CHECK-64: omp.dispatch.end:1444// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])1445// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41446// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 01447// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1448// CHECK-64: .omp.final.then:1449// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41450// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1451// CHECK-64: .omp.final.done:1452// CHECK-64-NEXT: ret void1453//1454//1455// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l301456// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {1457// CHECK-64-NEXT: entry:1458// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 81459// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41460// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41461// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 81462// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_kernel_environment, ptr [[DYN_PTR]])1463// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11464// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1465// CHECK-64: user_code.entry:1466// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1467// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41468// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 41469// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]1470// CHECK-64-NEXT: call void @__kmpc_target_deinit()1471// CHECK-64-NEXT: ret void1472// CHECK-64: worker.exit:1473// CHECK-64-NEXT: ret void1474//1475//1476// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined1477// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {1478// CHECK-64-NEXT: entry:1479// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81480// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81481// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41482// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41483// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41484// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41485// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41486// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41487// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41488// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 81489// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81490// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81491// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41492// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 41493// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41494// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41495// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()1496// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81497// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41498// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])1499// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41500// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 91501// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1502// CHECK-64: cond.true:1503// CHECK-64-NEXT: br label [[COND_END:%.*]]1504// CHECK-64: cond.false:1505// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41506// CHECK-64-NEXT: br label [[COND_END]]1507// CHECK-64: cond.end:1508// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1509// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41510// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41511// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41512// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1513// CHECK-64: omp.inner.for.cond:1514// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259:![0-9]+]]1515// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 101516// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1517// CHECK-64: omp.inner.for.body:1518// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]1519// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i641520// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]1521// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i641522// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 01523// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr1524// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP259]]1525// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 11526// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr1527// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP259]]1528// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP259]]1529// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1530// CHECK-64: omp.inner.for.inc:1531// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259]]1532// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP259]]1533// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]1534// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259]]1535// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]1536// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP259]]1537// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]1538// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]1539// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]1540// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP259]]1541// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]1542// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]1543// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]1544// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 91545// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]1546// CHECK-64: cond.true5:1547// CHECK-64-NEXT: br label [[COND_END7:%.*]]1548// CHECK-64: cond.false6:1549// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]1550// CHECK-64-NEXT: br label [[COND_END7]]1551// CHECK-64: cond.end7:1552// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]1553// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]1554// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]1555// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259]]1556// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP260:![0-9]+]]1557// CHECK-64: omp.inner.for.end:1558// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1559// CHECK-64: omp.loop.exit:1560// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])1561// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41562// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 01563// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1564// CHECK-64: .omp.final.then:1565// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41566// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1567// CHECK-64: .omp.final.done:1568// CHECK-64-NEXT: ret void1569//1570//1571// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined_omp_outlined1572// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {1573// CHECK-64-NEXT: entry:1574// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81575// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81576// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81577// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81578// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41579// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41580// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41581// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41582// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41583// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41584// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41585// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81586// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81587// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81588// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81589// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41590// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41591// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81592// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i321593// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81594// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i321595// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41596// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 41597// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41598// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41599// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41600// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41601// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81602// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41603// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)1604// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]1605// CHECK-64: omp.dispatch.cond:1606// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])1607// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 01608// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]1609// CHECK-64: omp.dispatch.body:1610// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41611// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 41612// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1613// CHECK-64: omp.inner.for.cond:1614// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262:![0-9]+]]1615// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP262]]1616// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]1617// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1618// CHECK-64: omp.inner.for.body:1619// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262]]1620// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 11621// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1622// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP262]]1623// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1624// CHECK-64: omp.body.continue:1625// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1626// CHECK-64: omp.inner.for.inc:1627// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262]]1628// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 11629// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262]]1630// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP263:![0-9]+]]1631// CHECK-64: omp.inner.for.end:1632// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]1633// CHECK-64: omp.dispatch.inc:1634// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]1635// CHECK-64: omp.dispatch.end:1636// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])1637// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41638// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 01639// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1640// CHECK-64: .omp.final.then:1641// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41642// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1643// CHECK-64: .omp.final.done:1644// CHECK-64-NEXT: ret void1645//1646//1647// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l331648// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {1649// CHECK-64-NEXT: entry:1650// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 81651// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41652// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41653// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 81654// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_kernel_environment, ptr [[DYN_PTR]])1655// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11656// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1657// CHECK-64: user_code.entry:1658// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1659// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41660// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 41661// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]1662// CHECK-64-NEXT: call void @__kmpc_target_deinit()1663// CHECK-64-NEXT: ret void1664// CHECK-64: worker.exit:1665// CHECK-64-NEXT: ret void1666//1667//1668// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined1669// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {1670// CHECK-64-NEXT: entry:1671// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81672// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81673// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41674// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41675// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41676// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41677// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41678// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41679// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41680// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 81681// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81682// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81683// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41684// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 41685// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41686// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41687// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()1688// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81689// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41690// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])1691// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41692// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 91693// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1694// CHECK-64: cond.true:1695// CHECK-64-NEXT: br label [[COND_END:%.*]]1696// CHECK-64: cond.false:1697// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41698// CHECK-64-NEXT: br label [[COND_END]]1699// CHECK-64: cond.end:1700// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1701// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41702// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41703// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41704// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1705// CHECK-64: omp.inner.for.cond:1706// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265:![0-9]+]]1707// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 101708// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1709// CHECK-64: omp.inner.for.body:1710// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]1711// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i641712// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]1713// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i641714// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 01715// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr1716// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP265]]1717// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 11718// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr1719// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP265]]1720// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP265]]1721// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1722// CHECK-64: omp.inner.for.inc:1723// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265]]1724// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP265]]1725// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]1726// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265]]1727// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]1728// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP265]]1729// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]1730// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]1731// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]1732// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP265]]1733// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]1734// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]1735// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]1736// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 91737// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]1738// CHECK-64: cond.true5:1739// CHECK-64-NEXT: br label [[COND_END7:%.*]]1740// CHECK-64: cond.false6:1741// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]1742// CHECK-64-NEXT: br label [[COND_END7]]1743// CHECK-64: cond.end7:1744// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]1745// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]1746// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]1747// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265]]1748// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP266:![0-9]+]]1749// CHECK-64: omp.inner.for.end:1750// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1751// CHECK-64: omp.loop.exit:1752// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])1753// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41754// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 01755// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1756// CHECK-64: .omp.final.then:1757// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41758// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1759// CHECK-64: .omp.final.done:1760// CHECK-64-NEXT: ret void1761//1762//1763// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined_omp_outlined1764// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {1765// CHECK-64-NEXT: entry:1766// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81767// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81768// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81769// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81770// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41771// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41772// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41773// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41774// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41775// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41776// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41777// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81778// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81779// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81780// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81781// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41782// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41783// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81784// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i321785// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81786// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i321787// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 41788// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 41789// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41790// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41791// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41792// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41793// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81794// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41795// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)1796// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]1797// CHECK-64: omp.dispatch.cond:1798// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])1799// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 01800// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]1801// CHECK-64: omp.dispatch.body:1802// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41803// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 41804// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1805// CHECK-64: omp.inner.for.cond:1806// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268:![0-9]+]]1807// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP268]]1808// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]1809// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1810// CHECK-64: omp.inner.for.body:1811// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268]]1812// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 11813// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1814// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP268]]1815// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1816// CHECK-64: omp.body.continue:1817// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1818// CHECK-64: omp.inner.for.inc:1819// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268]]1820// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 11821// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268]]1822// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP269:![0-9]+]]1823// CHECK-64: omp.inner.for.end:1824// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]1825// CHECK-64: omp.dispatch.inc:1826// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]1827// CHECK-64: omp.dispatch.end:1828// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])1829// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41830// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 01831// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1832// CHECK-64: .omp.final.then:1833// CHECK-64-NEXT: store i32 10, ptr [[I]], align 41834// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]1835// CHECK-64: .omp.final.done:1836// CHECK-64-NEXT: ret void1837//1838//1839// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l371840// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[A:%.*]]) #[[ATTR0]] {1841// CHECK-64-NEXT: entry:1842// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 81843// CHECK-64-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81844// CHECK-64-NEXT: [[A_CASTED:%.*]] = alloca i64, align 81845// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41846// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41847// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 81848// CHECK-64-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81849// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_kernel_environment, ptr [[DYN_PTR]])1850// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11851// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1852// CHECK-64: user_code.entry:1853// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1854// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[A_ADDR]], align 41855// CHECK-64-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 41856// CHECK-64-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 81857// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41858// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 41859// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], i64 [[TMP3]]) #[[ATTR2]]1860// CHECK-64-NEXT: call void @__kmpc_target_deinit()1861// CHECK-64-NEXT: ret void1862// CHECK-64: worker.exit:1863// CHECK-64-NEXT: ret void1864//1865//1866// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined1867// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {1868// CHECK-64-NEXT: entry:1869// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81870// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81871// CHECK-64-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81872// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41873// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41874// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 41875// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 41876// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41877// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41878// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41879// CHECK-64-NEXT: [[A_CASTED:%.*]] = alloca i64, align 81880// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x ptr], align 81881// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81882// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81883// CHECK-64-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81884// CHECK-64-NEXT: [[A1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 4)1885// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 41886// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 41887// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41888// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41889// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()1890// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81891// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 41892// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])1893// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41894// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 91895// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1896// CHECK-64: cond.true:1897// CHECK-64-NEXT: br label [[COND_END:%.*]]1898// CHECK-64: cond.false:1899// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41900// CHECK-64-NEXT: br label [[COND_END]]1901// CHECK-64: cond.end:1902// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]1903// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 41904// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41905// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 41906// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1907// CHECK-64: omp.inner.for.cond:1908// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41909// CHECK-64-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP5]], 101910// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1911// CHECK-64: omp.inner.for.body:1912// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41913// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i641914// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41915// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i641916// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[A1]], align 41917// CHECK-64-NEXT: store i32 [[TMP10]], ptr [[A_CASTED]], align 41918// CHECK-64-NEXT: [[TMP11:%.*]] = load i64, ptr [[A_CASTED]], align 81919// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 01920// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP7]] to ptr1921// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 81922// CHECK-64-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 11923// CHECK-64-NEXT: [[TMP15:%.*]] = inttoptr i64 [[TMP9]] to ptr1924// CHECK-64-NEXT: store ptr [[TMP15]], ptr [[TMP14]], align 81925// CHECK-64-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 21926// CHECK-64-NEXT: [[TMP17:%.*]] = inttoptr i64 [[TMP11]] to ptr1927// CHECK-64-NEXT: store ptr [[TMP17]], ptr [[TMP16]], align 81928// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 3)1929// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1930// CHECK-64: omp.inner.for.inc:1931// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41932// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41933// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]1934// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 41935// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41936// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41937// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]1938// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_LB]], align 41939// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41940// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 41941// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]1942// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_COMB_UB]], align 41943// CHECK-64-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41944// CHECK-64-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP24]], 91945// CHECK-64-NEXT: br i1 [[CMP5]], label [[COND_TRUE6:%.*]], label [[COND_FALSE7:%.*]]1946// CHECK-64: cond.true6:1947// CHECK-64-NEXT: br label [[COND_END8:%.*]]1948// CHECK-64: cond.false7:1949// CHECK-64-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 41950// CHECK-64-NEXT: br label [[COND_END8]]1951// CHECK-64: cond.end8:1952// CHECK-64-NEXT: [[COND9:%.*]] = phi i32 [ 9, [[COND_TRUE6]] ], [ [[TMP25]], [[COND_FALSE7]] ]1953// CHECK-64-NEXT: store i32 [[COND9]], ptr [[DOTOMP_COMB_UB]], align 41954// CHECK-64-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 41955// CHECK-64-NEXT: store i32 [[TMP26]], ptr [[DOTOMP_IV]], align 41956// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]1957// CHECK-64: omp.inner.for.end:1958// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1959// CHECK-64: omp.loop.exit:1960// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])1961// CHECK-64-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41962// CHECK-64-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 01963// CHECK-64-NEXT: br i1 [[TMP28]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]1964// CHECK-64: .omp.lastprivate.then:1965// CHECK-64-NEXT: [[TMP29:%.*]] = load i32, ptr [[A1]], align 41966// CHECK-64-NEXT: store i32 [[TMP29]], ptr [[A_ADDR]], align 41967// CHECK-64-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]1968// CHECK-64: .omp.lastprivate.done:1969// CHECK-64-NEXT: call void @__kmpc_free_shared(ptr [[A1]], i64 4)1970// CHECK-64-NEXT: ret void1971//1972//1973// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined_omp_outlined1974// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {1975// CHECK-64-NEXT: entry:1976// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81977// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81978// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 81979// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 81980// CHECK-64-NEXT: [[A_ADDR:%.*]] = alloca i64, align 81981// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41982// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 41983// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41984// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41985// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41986// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41987// CHECK-64-NEXT: [[A2:%.*]] = alloca i32, align 41988// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 41989// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81990// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81991// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 81992// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 81993// CHECK-64-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 81994// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41995// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 41996// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 81997// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i321998// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 81999// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i322000// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 42001// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 42002// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42003// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42004// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82005// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 42006// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2007// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42008// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42009// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2010// CHECK-64: omp.inner.for.cond:2011// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42012// CHECK-64-NEXT: [[CONV3:%.*]] = sext i32 [[TMP5]] to i642013// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82014// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV3]], [[TMP6]]2015// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2016// CHECK-64: omp.inner.for.body:2017// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42018// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 12019// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2020// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 42021// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[I]], align 42022// CHECK-64-NEXT: store i32 [[TMP8]], ptr [[A2]], align 42023// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2024// CHECK-64: omp.body.continue:2025// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2026// CHECK-64: omp.inner.for.inc:2027// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42028// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42029// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]2030// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 42031// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2032// CHECK-64: omp.inner.for.end:2033// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2034// CHECK-64: omp.loop.exit:2035// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])2036// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42037// CHECK-64-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 02038// CHECK-64-NEXT: br i1 [[TMP12]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]2039// CHECK-64: .omp.lastprivate.then:2040// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[A2]], align 42041// CHECK-64-NEXT: store i32 [[TMP13]], ptr [[A_ADDR]], align 42042// CHECK-64-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]2043// CHECK-64: .omp.lastprivate.done:2044// CHECK-64-NEXT: ret void2045//2046//2047// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l402048// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {2049// CHECK-64-NEXT: entry:2050// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 82051// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42052// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42053// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 82054// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_kernel_environment, ptr [[DYN_PTR]])2055// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12056// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2057// CHECK-64: user_code.entry:2058// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2059// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42060// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 42061// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]2062// CHECK-64-NEXT: call void @__kmpc_target_deinit()2063// CHECK-64-NEXT: ret void2064// CHECK-64: worker.exit:2065// CHECK-64-NEXT: ret void2066//2067//2068// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined2069// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {2070// CHECK-64-NEXT: entry:2071// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82072// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82073// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42074// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42075// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42076// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42077// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42078// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42079// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42080// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 82081// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82082// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82083// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42084// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 42085// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42086// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42087// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()2088// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82089// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42090// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])2091// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42092// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 92093// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2094// CHECK-64: cond.true:2095// CHECK-64-NEXT: br label [[COND_END:%.*]]2096// CHECK-64: cond.false:2097// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42098// CHECK-64-NEXT: br label [[COND_END]]2099// CHECK-64: cond.end:2100// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]2101// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42102// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42103// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42104// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2105// CHECK-64: omp.inner.for.cond:2106// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42107// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 102108// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2109// CHECK-64: omp.inner.for.body:2110// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42111// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i642112// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42113// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i642114// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 02115// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr2116// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 82117// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 12118// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr2119// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82120// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)2121// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2122// CHECK-64: omp.inner.for.inc:2123// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42124// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42125// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]2126// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 42127// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42128// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42129// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]2130// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 42131// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42132// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42133// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]2134// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 42135// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42136// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 92137// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]2138// CHECK-64: cond.true5:2139// CHECK-64-NEXT: br label [[COND_END7:%.*]]2140// CHECK-64: cond.false6:2141// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42142// CHECK-64-NEXT: br label [[COND_END7]]2143// CHECK-64: cond.end7:2144// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]2145// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 42146// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42147// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 42148// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2149// CHECK-64: omp.inner.for.end:2150// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2151// CHECK-64: omp.loop.exit:2152// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])2153// CHECK-64-NEXT: ret void2154//2155//2156// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined_omp_outlined2157// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {2158// CHECK-64-NEXT: entry:2159// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82160// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82161// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 82162// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 82163// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42164// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42165// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42166// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42167// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42168// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42169// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42170// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82171// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82172// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 82173// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 82174// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42175// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42176// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 82177// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i322178// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82179// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i322180// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 42181// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 42182// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42183// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42184// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82185// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 42186// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2187// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42188// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 92189// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2190// CHECK-64: cond.true:2191// CHECK-64-NEXT: br label [[COND_END:%.*]]2192// CHECK-64: cond.false:2193// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42194// CHECK-64-NEXT: br label [[COND_END]]2195// CHECK-64: cond.end:2196// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]2197// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42198// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42199// CHECK-64-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 42200// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2201// CHECK-64: omp.inner.for.cond:2202// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42203// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42204// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]2205// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2206// CHECK-64: omp.inner.for.body:2207// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42208// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 12209// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2210// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 42211// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2212// CHECK-64: omp.body.continue:2213// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2214// CHECK-64: omp.inner.for.inc:2215// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42216// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 12217// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 42218// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2219// CHECK-64: omp.inner.for.end:2220// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2221// CHECK-64: omp.loop.exit:2222// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])2223// CHECK-64-NEXT: ret void2224//2225//2226// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l432227// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {2228// CHECK-64-NEXT: entry:2229// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 82230// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42231// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42232// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 82233// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_kernel_environment, ptr [[DYN_PTR]])2234// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12235// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2236// CHECK-64: user_code.entry:2237// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2238// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42239// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 42240// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]2241// CHECK-64-NEXT: call void @__kmpc_target_deinit()2242// CHECK-64-NEXT: ret void2243// CHECK-64: worker.exit:2244// CHECK-64-NEXT: ret void2245//2246//2247// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined2248// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {2249// CHECK-64-NEXT: entry:2250// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82251// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82252// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42253// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42254// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42255// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42256// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42257// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42258// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42259// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 82260// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82261// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82262// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42263// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 42264// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42265// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42266// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()2267// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82268// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42269// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])2270// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42271// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 92272// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2273// CHECK-64: cond.true:2274// CHECK-64-NEXT: br label [[COND_END:%.*]]2275// CHECK-64: cond.false:2276// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42277// CHECK-64-NEXT: br label [[COND_END]]2278// CHECK-64: cond.end:2279// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]2280// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42281// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42282// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42283// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2284// CHECK-64: omp.inner.for.cond:2285// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42286// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 102287// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2288// CHECK-64: omp.inner.for.body:2289// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42290// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i642291// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42292// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i642293// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 02294// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr2295// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 82296// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 12297// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr2298// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82299// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)2300// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2301// CHECK-64: omp.inner.for.inc:2302// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42303// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42304// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]2305// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 42306// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42307// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42308// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]2309// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 42310// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42311// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42312// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]2313// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 42314// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42315// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 92316// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]2317// CHECK-64: cond.true5:2318// CHECK-64-NEXT: br label [[COND_END7:%.*]]2319// CHECK-64: cond.false6:2320// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42321// CHECK-64-NEXT: br label [[COND_END7]]2322// CHECK-64: cond.end7:2323// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]2324// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 42325// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42326// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 42327// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2328// CHECK-64: omp.inner.for.end:2329// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2330// CHECK-64: omp.loop.exit:2331// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])2332// CHECK-64-NEXT: ret void2333//2334//2335// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined_omp_outlined2336// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {2337// CHECK-64-NEXT: entry:2338// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82339// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82340// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 82341// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 82342// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42343// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42344// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42345// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42346// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42347// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42348// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42349// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82350// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82351// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 82352// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 82353// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42354// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42355// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 82356// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i322357// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82358// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i322359// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 42360// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 42361// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42362// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42363// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82364// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 42365// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2366// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42367// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42368// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2369// CHECK-64: omp.inner.for.cond:2370// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42371// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i642372// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82373// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]2374// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2375// CHECK-64: omp.inner.for.body:2376// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42377// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 12378// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2379// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 42380// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2381// CHECK-64: omp.body.continue:2382// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2383// CHECK-64: omp.inner.for.inc:2384// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42385// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42386// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]2387// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 42388// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2389// CHECK-64: omp.inner.for.end:2390// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2391// CHECK-64: omp.loop.exit:2392// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])2393// CHECK-64-NEXT: ret void2394//2395//2396// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l462397// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {2398// CHECK-64-NEXT: entry:2399// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 82400// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42401// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42402// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 82403// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_kernel_environment, ptr [[DYN_PTR]])2404// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12405// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2406// CHECK-64: user_code.entry:2407// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2408// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42409// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 42410// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]2411// CHECK-64-NEXT: call void @__kmpc_target_deinit()2412// CHECK-64-NEXT: ret void2413// CHECK-64: worker.exit:2414// CHECK-64-NEXT: ret void2415//2416//2417// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined2418// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {2419// CHECK-64-NEXT: entry:2420// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82421// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82422// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42423// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42424// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42425// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42426// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42427// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42428// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42429// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 82430// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82431// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82432// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42433// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 42434// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42435// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42436// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()2437// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82438// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42439// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])2440// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42441// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 92442// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2443// CHECK-64: cond.true:2444// CHECK-64-NEXT: br label [[COND_END:%.*]]2445// CHECK-64: cond.false:2446// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42447// CHECK-64-NEXT: br label [[COND_END]]2448// CHECK-64: cond.end:2449// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]2450// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42451// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42452// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42453// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2454// CHECK-64: omp.inner.for.cond:2455// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42456// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 102457// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2458// CHECK-64: omp.inner.for.body:2459// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42460// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i642461// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42462// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i642463// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 02464// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr2465// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 82466// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 12467// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr2468// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82469// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)2470// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2471// CHECK-64: omp.inner.for.inc:2472// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42473// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42474// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]2475// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 42476// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42477// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42478// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]2479// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 42480// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42481// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42482// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]2483// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 42484// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42485// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 92486// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]2487// CHECK-64: cond.true5:2488// CHECK-64-NEXT: br label [[COND_END7:%.*]]2489// CHECK-64: cond.false6:2490// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42491// CHECK-64-NEXT: br label [[COND_END7]]2492// CHECK-64: cond.end7:2493// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]2494// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 42495// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42496// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 42497// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2498// CHECK-64: omp.inner.for.end:2499// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2500// CHECK-64: omp.loop.exit:2501// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])2502// CHECK-64-NEXT: ret void2503//2504//2505// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined_omp_outlined2506// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {2507// CHECK-64-NEXT: entry:2508// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82509// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82510// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 82511// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 82512// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42513// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42514// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42515// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42516// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42517// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42518// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42519// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82520// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82521// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 82522// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 82523// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42524// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42525// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 82526// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i322527// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82528// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i322529// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 42530// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 42531// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42532// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42533// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42534// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42535// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82536// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 42537// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)2538// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]2539// CHECK-64: omp.dispatch.cond:2540// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])2541// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 02542// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]2543// CHECK-64: omp.dispatch.body:2544// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42545// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 42546// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2547// CHECK-64: omp.inner.for.cond:2548// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271:![0-9]+]]2549// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP271]]2550// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]2551// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2552// CHECK-64: omp.inner.for.body:2553// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271]]2554// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 12555// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2556// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP271]]2557// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2558// CHECK-64: omp.body.continue:2559// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2560// CHECK-64: omp.inner.for.inc:2561// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271]]2562// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 12563// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271]]2564// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP272:![0-9]+]]2565// CHECK-64: omp.inner.for.end:2566// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]2567// CHECK-64: omp.dispatch.inc:2568// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]2569// CHECK-64: omp.dispatch.end:2570// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])2571// CHECK-64-NEXT: ret void2572//2573//2574// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l492575// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {2576// CHECK-64-NEXT: entry:2577// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 82578// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42579// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42580// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 82581// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_kernel_environment, ptr [[DYN_PTR]])2582// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12583// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2584// CHECK-64: user_code.entry:2585// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2586// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42587// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 42588// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]2589// CHECK-64-NEXT: call void @__kmpc_target_deinit()2590// CHECK-64-NEXT: ret void2591// CHECK-64: worker.exit:2592// CHECK-64-NEXT: ret void2593//2594//2595// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined2596// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {2597// CHECK-64-NEXT: entry:2598// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82599// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82600// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42601// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42602// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42603// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42604// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42605// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42606// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42607// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 82608// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82609// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82610// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42611// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 42612// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42613// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42614// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()2615// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82616// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42617// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])2618// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42619// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 92620// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2621// CHECK-64: cond.true:2622// CHECK-64-NEXT: br label [[COND_END:%.*]]2623// CHECK-64: cond.false:2624// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42625// CHECK-64-NEXT: br label [[COND_END]]2626// CHECK-64: cond.end:2627// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]2628// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42629// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42630// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42631// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2632// CHECK-64: omp.inner.for.cond:2633// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42634// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 102635// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2636// CHECK-64: omp.inner.for.body:2637// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42638// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i642639// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42640// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i642641// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 02642// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr2643// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 82644// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 12645// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr2646// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82647// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)2648// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2649// CHECK-64: omp.inner.for.inc:2650// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42651// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42652// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]2653// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 42654// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42655// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42656// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]2657// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 42658// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42659// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42660// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]2661// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 42662// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42663// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 92664// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]2665// CHECK-64: cond.true5:2666// CHECK-64-NEXT: br label [[COND_END7:%.*]]2667// CHECK-64: cond.false6:2668// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42669// CHECK-64-NEXT: br label [[COND_END7]]2670// CHECK-64: cond.end7:2671// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]2672// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 42673// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42674// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 42675// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2676// CHECK-64: omp.inner.for.end:2677// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2678// CHECK-64: omp.loop.exit:2679// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])2680// CHECK-64-NEXT: ret void2681//2682//2683// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined_omp_outlined2684// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {2685// CHECK-64-NEXT: entry:2686// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82687// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82688// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 82689// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 82690// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42691// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42692// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42693// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42694// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42695// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42696// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42697// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82698// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82699// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 82700// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 82701// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42702// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42703// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 82704// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i322705// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82706// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i322707// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 42708// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 42709// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42710// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42711// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42712// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42713// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82714// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 42715// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)2716// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]2717// CHECK-64: omp.dispatch.cond:2718// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])2719// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 02720// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]2721// CHECK-64: omp.dispatch.body:2722// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42723// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 42724// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2725// CHECK-64: omp.inner.for.cond:2726// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274:![0-9]+]]2727// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP274]]2728// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]2729// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2730// CHECK-64: omp.inner.for.body:2731// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274]]2732// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 12733// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2734// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP274]]2735// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2736// CHECK-64: omp.body.continue:2737// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2738// CHECK-64: omp.inner.for.inc:2739// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274]]2740// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 12741// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274]]2742// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP275:![0-9]+]]2743// CHECK-64: omp.inner.for.end:2744// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]2745// CHECK-64: omp.dispatch.inc:2746// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]2747// CHECK-64: omp.dispatch.end:2748// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])2749// CHECK-64-NEXT: ret void2750//2751//2752// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l522753// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {2754// CHECK-64-NEXT: entry:2755// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 82756// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42757// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42758// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 82759// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_kernel_environment, ptr [[DYN_PTR]])2760// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12761// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2762// CHECK-64: user_code.entry:2763// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2764// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42765// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 42766// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]2767// CHECK-64-NEXT: call void @__kmpc_target_deinit()2768// CHECK-64-NEXT: ret void2769// CHECK-64: worker.exit:2770// CHECK-64-NEXT: ret void2771//2772//2773// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined2774// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {2775// CHECK-64-NEXT: entry:2776// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82777// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82778// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42779// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42780// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42781// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42782// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42783// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42784// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42785// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 82786// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82787// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82788// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42789// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 42790// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42791// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42792// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()2793// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82794// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42795// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])2796// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42797// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 92798// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2799// CHECK-64: cond.true:2800// CHECK-64-NEXT: br label [[COND_END:%.*]]2801// CHECK-64: cond.false:2802// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42803// CHECK-64-NEXT: br label [[COND_END]]2804// CHECK-64: cond.end:2805// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]2806// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42807// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42808// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42809// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2810// CHECK-64: omp.inner.for.cond:2811// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42812// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 102813// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2814// CHECK-64: omp.inner.for.body:2815// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42816// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i642817// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42818// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i642819// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 02820// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr2821// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 82822// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 12823// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr2824// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 82825// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)2826// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2827// CHECK-64: omp.inner.for.inc:2828// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42829// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42830// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]2831// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 42832// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42833// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42834// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]2835// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 42836// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42837// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 42838// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]2839// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 42840// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42841// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 92842// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]2843// CHECK-64: cond.true5:2844// CHECK-64-NEXT: br label [[COND_END7:%.*]]2845// CHECK-64: cond.false6:2846// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42847// CHECK-64-NEXT: br label [[COND_END7]]2848// CHECK-64: cond.end7:2849// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]2850// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 42851// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42852// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 42853// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]2854// CHECK-64: omp.inner.for.end:2855// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2856// CHECK-64: omp.loop.exit:2857// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])2858// CHECK-64-NEXT: ret void2859//2860//2861// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined_omp_outlined2862// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {2863// CHECK-64-NEXT: entry:2864// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82865// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82866// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 82867// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 82868// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42869// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42870// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42871// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42872// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42873// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42874// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42875// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82876// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82877// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 82878// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 82879// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42880// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 42881// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 82882// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i322883// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 82884// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i322885// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 42886// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 42887// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42888// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42889// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42890// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42891// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82892// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 42893// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)2894// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]2895// CHECK-64: omp.dispatch.cond:2896// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])2897// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 02898// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]2899// CHECK-64: omp.dispatch.body:2900// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42901// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 42902// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2903// CHECK-64: omp.inner.for.cond:2904// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277:![0-9]+]]2905// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP277]]2906// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]2907// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2908// CHECK-64: omp.inner.for.body:2909// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277]]2910// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 12911// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2912// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP277]]2913// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2914// CHECK-64: omp.body.continue:2915// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2916// CHECK-64: omp.inner.for.inc:2917// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277]]2918// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 12919// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277]]2920// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP278:![0-9]+]]2921// CHECK-64: omp.inner.for.end:2922// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]2923// CHECK-64: omp.dispatch.inc:2924// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]2925// CHECK-64: omp.dispatch.end:2926// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])2927// CHECK-64-NEXT: ret void2928//2929//2930// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l552931// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {2932// CHECK-64-NEXT: entry:2933// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 82934// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42935// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42936// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 82937// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_kernel_environment, ptr [[DYN_PTR]])2938// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12939// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2940// CHECK-64: user_code.entry:2941// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2942// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42943// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 42944// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]2945// CHECK-64-NEXT: call void @__kmpc_target_deinit()2946// CHECK-64-NEXT: ret void2947// CHECK-64: worker.exit:2948// CHECK-64-NEXT: ret void2949//2950//2951// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined2952// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {2953// CHECK-64-NEXT: entry:2954// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82955// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82956// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42957// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 42958// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 42959// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 42960// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42961// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42962// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 42963// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 82964// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82965// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82966// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 42967// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 42968// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42969// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42970// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()2971// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82972// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 42973// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])2974// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42975// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 92976// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2977// CHECK-64: cond.true:2978// CHECK-64-NEXT: br label [[COND_END:%.*]]2979// CHECK-64: cond.false:2980// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42981// CHECK-64-NEXT: br label [[COND_END]]2982// CHECK-64: cond.end:2983// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]2984// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 42985// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42986// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 42987// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2988// CHECK-64: omp.inner.for.cond:2989// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42990// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 102991// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2992// CHECK-64: omp.inner.for.body:2993// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 42994// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i642995// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 42996// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i642997// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 02998// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr2999// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 83000// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 13001// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr3002// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 83003// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)3004// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3005// CHECK-64: omp.inner.for.inc:3006// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43007// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 43008// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]3009// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 43010// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43011// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 43012// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]3013// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 43014// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43015// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 43016// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]3017// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 43018// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43019// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 93020// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]3021// CHECK-64: cond.true5:3022// CHECK-64-NEXT: br label [[COND_END7:%.*]]3023// CHECK-64: cond.false6:3024// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43025// CHECK-64-NEXT: br label [[COND_END7]]3026// CHECK-64: cond.end7:3027// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]3028// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 43029// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43030// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 43031// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]3032// CHECK-64: omp.inner.for.end:3033// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3034// CHECK-64: omp.loop.exit:3035// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])3036// CHECK-64-NEXT: ret void3037//3038//3039// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined_omp_outlined3040// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {3041// CHECK-64-NEXT: entry:3042// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83043// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83044// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 83045// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 83046// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43047// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43048// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43049// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43050// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43051// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43052// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43053// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83054// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83055// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 83056// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 83057// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43058// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43059// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 83060// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i323061// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 83062// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i323063// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 43064// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 43065// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43066// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43067// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43068// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43069// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83070// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 43071// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)3072// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]3073// CHECK-64: omp.dispatch.cond:3074// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])3075// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 03076// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]3077// CHECK-64: omp.dispatch.body:3078// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43079// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 43080// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3081// CHECK-64: omp.inner.for.cond:3082// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280:![0-9]+]]3083// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP280]]3084// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]3085// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3086// CHECK-64: omp.inner.for.body:3087// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280]]3088// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 13089// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3090// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP280]]3091// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3092// CHECK-64: omp.body.continue:3093// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3094// CHECK-64: omp.inner.for.inc:3095// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280]]3096// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 13097// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280]]3098// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP281:![0-9]+]]3099// CHECK-64: omp.inner.for.end:3100// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]3101// CHECK-64: omp.dispatch.inc:3102// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]3103// CHECK-64: omp.dispatch.end:3104// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])3105// CHECK-64-NEXT: ret void3106//3107//3108// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l583109// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {3110// CHECK-64-NEXT: entry:3111// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 83112// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43113// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 43114// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 83115// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_kernel_environment, ptr [[DYN_PTR]])3116// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -13117// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]3118// CHECK-64: user_code.entry:3119// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3120// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43121// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 43122// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]3123// CHECK-64-NEXT: call void @__kmpc_target_deinit()3124// CHECK-64-NEXT: ret void3125// CHECK-64: worker.exit:3126// CHECK-64-NEXT: ret void3127//3128//3129// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined3130// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {3131// CHECK-64-NEXT: entry:3132// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83133// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83134// CHECK-64-NEXT: [[B:%.*]] = alloca i32, align 43135// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43136// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43137// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 43138// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 43139// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43140// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43141// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43142// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 83143// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83144// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83145// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 43146// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 43147// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43148// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43149// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()3150// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83151// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 43152// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])3153// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43154// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 93155// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3156// CHECK-64: cond.true:3157// CHECK-64-NEXT: br label [[COND_END:%.*]]3158// CHECK-64: cond.false:3159// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43160// CHECK-64-NEXT: br label [[COND_END]]3161// CHECK-64: cond.end:3162// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]3163// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 43164// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43165// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43166// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3167// CHECK-64: omp.inner.for.cond:3168// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283:![0-9]+]]3169// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 103170// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3171// CHECK-64: omp.inner.for.body:3172// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]3173// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i643174// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]3175// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i643176// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 03177// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr3178// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP283]]3179// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 13180// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr3181// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP283]]3182// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP283]]3183// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3184// CHECK-64: omp.inner.for.inc:3185// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283]]3186// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP283]]3187// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]3188// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283]]3189// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]3190// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP283]]3191// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]3192// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]3193// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]3194// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP283]]3195// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]3196// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]3197// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]3198// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 93199// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]3200// CHECK-64: cond.true5:3201// CHECK-64-NEXT: br label [[COND_END7:%.*]]3202// CHECK-64: cond.false6:3203// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]3204// CHECK-64-NEXT: br label [[COND_END7]]3205// CHECK-64: cond.end7:3206// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]3207// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]3208// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]3209// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283]]3210// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP284:![0-9]+]]3211// CHECK-64: omp.inner.for.end:3212// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3213// CHECK-64: omp.loop.exit:3214// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])3215// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43216// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 03217// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3218// CHECK-64: .omp.final.then:3219// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43220// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3221// CHECK-64: .omp.final.done:3222// CHECK-64-NEXT: ret void3223//3224//3225// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined_omp_outlined3226// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {3227// CHECK-64-NEXT: entry:3228// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83229// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83230// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 83231// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 83232// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43233// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43234// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43235// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43236// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43237// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43238// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43239// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83240// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83241// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 83242// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 83243// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43244// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43245// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 83246// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i323247// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 83248// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i323249// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 43250// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 43251// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43252// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43253// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83254// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 43255// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3256// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43257// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43258// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3259// CHECK-64: omp.inner.for.cond:3260// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286:![0-9]+]]3261// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i643262// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8, !llvm.access.group [[ACC_GRP286]]3263// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]3264// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3265// CHECK-64: omp.inner.for.body:3266// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286]]3267// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 13268// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3269// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP286]]3270// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3271// CHECK-64: omp.body.continue:3272// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3273// CHECK-64: omp.inner.for.inc:3274// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286]]3275// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP286]]3276// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]3277// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286]]3278// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP287:![0-9]+]]3279// CHECK-64: omp.inner.for.end:3280// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3281// CHECK-64: omp.loop.exit:3282// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])3283// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43284// CHECK-64-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 03285// CHECK-64-NEXT: br i1 [[TMP11]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3286// CHECK-64: .omp.final.then:3287// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43288// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3289// CHECK-64: .omp.final.done:3290// CHECK-64-NEXT: ret void3291//3292//3293// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l663294// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {3295// CHECK-64-NEXT: entry:3296// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 83297// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43298// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 43299// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 83300// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_kernel_environment, ptr [[DYN_PTR]])3301// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -13302// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]3303// CHECK-64: user_code.entry:3304// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3305// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43306// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 43307// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]3308// CHECK-64-NEXT: call void @__kmpc_target_deinit()3309// CHECK-64-NEXT: ret void3310// CHECK-64: worker.exit:3311// CHECK-64-NEXT: ret void3312//3313//3314// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined3315// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {3316// CHECK-64-NEXT: entry:3317// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83318// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83319// CHECK-64-NEXT: [[B:%.*]] = alloca [3 x i32], align 43320// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43321// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43322// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 43323// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 43324// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43325// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43326// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43327// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 83328// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83329// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83330// CHECK-64-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[B]], ptr align 4 @"__const.<captured>.b", i64 12, i1 false)3331// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 43332// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 43333// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43334// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43335// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()3336// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83337// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 43338// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])3339// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43340// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 93341// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3342// CHECK-64: cond.true:3343// CHECK-64-NEXT: br label [[COND_END:%.*]]3344// CHECK-64: cond.false:3345// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43346// CHECK-64-NEXT: br label [[COND_END]]3347// CHECK-64: cond.end:3348// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]3349// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 43350// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43351// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43352// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3353// CHECK-64: omp.inner.for.cond:3354// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289:![0-9]+]]3355// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 103356// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3357// CHECK-64: omp.inner.for.body:3358// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]3359// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i643360// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]3361// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i643362// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 03363// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr3364// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP289]]3365// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 13366// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr3367// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP289]]3368// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP289]]3369// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3370// CHECK-64: omp.inner.for.inc:3371// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289]]3372// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP289]]3373// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]3374// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289]]3375// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]3376// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP289]]3377// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]3378// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]3379// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]3380// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP289]]3381// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]3382// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]3383// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]3384// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 93385// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]3386// CHECK-64: cond.true5:3387// CHECK-64-NEXT: br label [[COND_END7:%.*]]3388// CHECK-64: cond.false6:3389// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]3390// CHECK-64-NEXT: br label [[COND_END7]]3391// CHECK-64: cond.end7:3392// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]3393// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]3394// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]3395// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289]]3396// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP290:![0-9]+]]3397// CHECK-64: omp.inner.for.end:3398// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3399// CHECK-64: omp.loop.exit:3400// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])3401// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43402// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 03403// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3404// CHECK-64: .omp.final.then:3405// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43406// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3407// CHECK-64: .omp.final.done:3408// CHECK-64-NEXT: ret void3409//3410//3411// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined_omp_outlined3412// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {3413// CHECK-64-NEXT: entry:3414// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83415// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83416// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 83417// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 83418// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43419// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43420// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43421// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43422// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43423// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43424// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43425// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83426// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83427// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 83428// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 83429// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43430// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43431// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 83432// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i323433// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 83434// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i323435// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 43436// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 43437// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43438// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43439// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83440// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 43441// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3442// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43443// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 93444// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3445// CHECK-64: cond.true:3446// CHECK-64-NEXT: br label [[COND_END:%.*]]3447// CHECK-64: cond.false:3448// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43449// CHECK-64-NEXT: br label [[COND_END]]3450// CHECK-64: cond.end:3451// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]3452// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43453// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43454// CHECK-64-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 43455// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3456// CHECK-64: omp.inner.for.cond:3457// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292:![0-9]+]]3458// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP292]]3459// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]3460// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3461// CHECK-64: omp.inner.for.body:3462// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292]]3463// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 13464// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3465// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP292]]3466// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3467// CHECK-64: omp.body.continue:3468// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3469// CHECK-64: omp.inner.for.inc:3470// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292]]3471// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 13472// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292]]3473// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP293:![0-9]+]]3474// CHECK-64: omp.inner.for.end:3475// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3476// CHECK-64: omp.loop.exit:3477// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])3478// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43479// CHECK-64-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 03480// CHECK-64-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3481// CHECK-64: .omp.final.then:3482// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43483// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3484// CHECK-64: .omp.final.done:3485// CHECK-64-NEXT: ret void3486//3487//3488// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l733489// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {3490// CHECK-64-NEXT: entry:3491// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 83492// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43493// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 43494// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 83495// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_kernel_environment, ptr [[DYN_PTR]])3496// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -13497// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]3498// CHECK-64: user_code.entry:3499// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3500// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43501// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 43502// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]3503// CHECK-64-NEXT: call void @__kmpc_target_deinit()3504// CHECK-64-NEXT: ret void3505// CHECK-64: worker.exit:3506// CHECK-64-NEXT: ret void3507//3508//3509// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined3510// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {3511// CHECK-64-NEXT: entry:3512// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83513// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83514// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43515// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43516// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 43517// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 43518// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43519// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43520// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43521// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 83522// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83523// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83524// CHECK-64-NEXT: [[C:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 8)3525// CHECK-64-NEXT: [[B:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 4)3526// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 43527// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 43528// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43529// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43530// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83531// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 43532// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3533// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43534// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 93535// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3536// CHECK-64: cond.true:3537// CHECK-64-NEXT: br label [[COND_END:%.*]]3538// CHECK-64: cond.false:3539// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43540// CHECK-64-NEXT: br label [[COND_END]]3541// CHECK-64: cond.end:3542// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]3543// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 43544// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43545// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43546// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3547// CHECK-64: omp.inner.for.cond:3548// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP295:![0-9]+]]3549// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP295]]3550// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]3551// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3552// CHECK-64: omp.inner.for.body:3553// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP295]]3554// CHECK-64-NEXT: [[TMP8:%.*]] = zext i32 [[TMP7]] to i643555// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP295]]3556// CHECK-64-NEXT: [[TMP10:%.*]] = zext i32 [[TMP9]] to i643557// CHECK-64-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 03558// CHECK-64-NEXT: [[TMP12:%.*]] = inttoptr i64 [[TMP8]] to ptr3559// CHECK-64-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 8, !llvm.access.group [[ACC_GRP295]]3560// CHECK-64-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 13561// CHECK-64-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP10]] to ptr3562// CHECK-64-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 8, !llvm.access.group [[ACC_GRP295]]3563// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined_wrapper, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP295]]3564// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3565// CHECK-64: omp.inner.for.inc:3566// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP295]]3567// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP295]]3568// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP15]], [[TMP16]]3569// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP295]]3570// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP296:![0-9]+]]3571// CHECK-64: omp.inner.for.end:3572// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3573// CHECK-64: omp.loop.exit:3574// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])3575// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43576// CHECK-64-NEXT: [[TMP18:%.*]] = icmp ne i32 [[TMP17]], 03577// CHECK-64-NEXT: br i1 [[TMP18]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3578// CHECK-64: .omp.final.then:3579// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43580// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3581// CHECK-64: .omp.final.done:3582// CHECK-64-NEXT: store ptr [[B]], ptr [[C]], align 83583// CHECK-64-NEXT: call void @__kmpc_free_shared(ptr [[B]], i64 4)3584// CHECK-64-NEXT: call void @__kmpc_free_shared(ptr [[C]], i64 8)3585// CHECK-64-NEXT: ret void3586//3587//3588// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined3589// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {3590// CHECK-64-NEXT: entry:3591// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83592// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83593// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 83594// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 83595// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43596// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43597// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43598// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43599// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43600// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43601// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43602// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83603// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83604// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 83605// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 83606// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43607// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43608// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 83609// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i323610// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 83611// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i323612// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 43613// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 43614// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43615// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43616// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83617// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 43618// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3619// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43620// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43621// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3622// CHECK-64: omp.inner.for.cond:3623// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298:![0-9]+]]3624// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i643625// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 8, !llvm.access.group [[ACC_GRP298]]3626// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]3627// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3628// CHECK-64: omp.inner.for.body:3629// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298]]3630// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 13631// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3632// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP298]]3633// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3634// CHECK-64: omp.body.continue:3635// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3636// CHECK-64: omp.inner.for.inc:3637// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298]]3638// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP298]]3639// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]3640// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298]]3641// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP299:![0-9]+]]3642// CHECK-64: omp.inner.for.end:3643// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3644// CHECK-64: omp.loop.exit:3645// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])3646// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43647// CHECK-64-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 03648// CHECK-64-NEXT: br i1 [[TMP11]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3649// CHECK-64: .omp.final.then:3650// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43651// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3652// CHECK-64: .omp.final.done:3653// CHECK-64-NEXT: ret void3654//3655//3656// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined_wrapper3657// CHECK-64-SAME: (i16 noundef zeroext [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR7:[0-9]+]] {3658// CHECK-64-NEXT: entry:3659// CHECK-64-NEXT: [[DOTADDR:%.*]] = alloca i16, align 23660// CHECK-64-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43661// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43662// CHECK-64-NEXT: [[GLOBAL_ARGS:%.*]] = alloca ptr, align 83663// CHECK-64-NEXT: store i16 [[TMP0]], ptr [[DOTADDR]], align 23664// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43665// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43666// CHECK-64-NEXT: call void @__kmpc_get_shared_variables(ptr [[GLOBAL_ARGS]])3667// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[GLOBAL_ARGS]], align 83668// CHECK-64-NEXT: [[TMP3:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 03669// CHECK-64-NEXT: [[TMP4:%.*]] = load i64, ptr [[TMP3]], align 83670// CHECK-64-NEXT: [[TMP5:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i64 13671// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 83672// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined(ptr [[DOTADDR1]], ptr [[DOTZERO_ADDR]], i64 [[TMP4]], i64 [[TMP6]]) #[[ATTR2]]3673// CHECK-64-NEXT: ret void3674//3675//3676// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l813677// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {3678// CHECK-64-NEXT: entry:3679// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 83680// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43681// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 43682// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 83683// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_kernel_environment, ptr [[DYN_PTR]])3684// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -13685// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]3686// CHECK-64: user_code.entry:3687// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3688// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43689// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 43690// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]3691// CHECK-64-NEXT: call void @__kmpc_target_deinit()3692// CHECK-64-NEXT: ret void3693// CHECK-64: worker.exit:3694// CHECK-64-NEXT: ret void3695//3696//3697// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined3698// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {3699// CHECK-64-NEXT: entry:3700// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83701// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83702// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43703// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43704// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 43705// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 43706// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43707// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43708// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43709// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 83710// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83711// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83712// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 43713// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 43714// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43715// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43716// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()3717// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83718// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 43719// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])3720// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43721// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 93722// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3723// CHECK-64: cond.true:3724// CHECK-64-NEXT: br label [[COND_END:%.*]]3725// CHECK-64: cond.false:3726// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43727// CHECK-64-NEXT: br label [[COND_END]]3728// CHECK-64: cond.end:3729// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]3730// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 43731// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43732// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43733// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3734// CHECK-64: omp.inner.for.cond:3735// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301:![0-9]+]]3736// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 103737// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3738// CHECK-64: omp.inner.for.body:3739// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]3740// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i643741// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]3742// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i643743// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 03744// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr3745// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP301]]3746// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 13747// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr3748// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP301]]3749// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP301]]3750// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3751// CHECK-64: omp.inner.for.inc:3752// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301]]3753// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP301]]3754// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]3755// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301]]3756// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]3757// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP301]]3758// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]3759// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]3760// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]3761// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP301]]3762// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]3763// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]3764// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]3765// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 93766// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]3767// CHECK-64: cond.true5:3768// CHECK-64-NEXT: br label [[COND_END7:%.*]]3769// CHECK-64: cond.false6:3770// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]3771// CHECK-64-NEXT: br label [[COND_END7]]3772// CHECK-64: cond.end7:3773// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]3774// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]3775// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]3776// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301]]3777// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP302:![0-9]+]]3778// CHECK-64: omp.inner.for.end:3779// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3780// CHECK-64: omp.loop.exit:3781// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])3782// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43783// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 03784// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3785// CHECK-64: .omp.final.then:3786// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43787// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3788// CHECK-64: .omp.final.done:3789// CHECK-64-NEXT: ret void3790//3791//3792// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined_omp_outlined3793// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {3794// CHECK-64-NEXT: entry:3795// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83796// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83797// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 83798// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 83799// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43800// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43801// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43802// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43803// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43804// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43805// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43806// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83807// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83808// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 83809// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 83810// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43811// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43812// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 83813// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i323814// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 83815// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i323816// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 43817// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 43818// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43819// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43820// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43821// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43822// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83823// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 43824// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)3825// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]3826// CHECK-64: omp.dispatch.cond:3827// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])3828// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 03829// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]3830// CHECK-64: omp.dispatch.body:3831// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43832// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 43833// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3834// CHECK-64: omp.inner.for.cond:3835// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304:![0-9]+]]3836// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP304]]3837// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]3838// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3839// CHECK-64: omp.inner.for.body:3840// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304]]3841// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 13842// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3843// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP304]]3844// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3845// CHECK-64: omp.body.continue:3846// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3847// CHECK-64: omp.inner.for.inc:3848// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304]]3849// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 13850// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304]]3851// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP305:![0-9]+]]3852// CHECK-64: omp.inner.for.end:3853// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]3854// CHECK-64: omp.dispatch.inc:3855// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]3856// CHECK-64: omp.dispatch.end:3857// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])3858// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43859// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 03860// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3861// CHECK-64: .omp.final.then:3862// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43863// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3864// CHECK-64: .omp.final.done:3865// CHECK-64-NEXT: ret void3866//3867//3868// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l853869// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {3870// CHECK-64-NEXT: entry:3871// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 83872// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43873// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 43874// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 83875// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_kernel_environment, ptr [[DYN_PTR]])3876// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -13877// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]3878// CHECK-64: user_code.entry:3879// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3880// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43881// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 43882// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]3883// CHECK-64-NEXT: call void @__kmpc_target_deinit()3884// CHECK-64-NEXT: ret void3885// CHECK-64: worker.exit:3886// CHECK-64-NEXT: ret void3887//3888//3889// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined3890// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {3891// CHECK-64-NEXT: entry:3892// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83893// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83894// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43895// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43896// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 43897// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 43898// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43899// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43900// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43901// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 83902// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83903// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83904// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 43905// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 43906// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43907// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43908// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()3909// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83910// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 43911// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])3912// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43913// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 93914// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3915// CHECK-64: cond.true:3916// CHECK-64-NEXT: br label [[COND_END:%.*]]3917// CHECK-64: cond.false:3918// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 43919// CHECK-64-NEXT: br label [[COND_END]]3920// CHECK-64: cond.end:3921// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]3922// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 43923// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 43924// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 43925// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3926// CHECK-64: omp.inner.for.cond:3927// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307:![0-9]+]]3928// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 103929// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3930// CHECK-64: omp.inner.for.body:3931// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]3932// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i643933// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]3934// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i643935// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 03936// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr3937// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP307]]3938// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 13939// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr3940// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP307]]3941// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP307]]3942// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3943// CHECK-64: omp.inner.for.inc:3944// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307]]3945// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP307]]3946// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]3947// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307]]3948// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]3949// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP307]]3950// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]3951// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]3952// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]3953// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP307]]3954// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]3955// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]3956// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]3957// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 93958// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]3959// CHECK-64: cond.true5:3960// CHECK-64-NEXT: br label [[COND_END7:%.*]]3961// CHECK-64: cond.false6:3962// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]3963// CHECK-64-NEXT: br label [[COND_END7]]3964// CHECK-64: cond.end7:3965// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]3966// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]3967// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]3968// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307]]3969// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP308:![0-9]+]]3970// CHECK-64: omp.inner.for.end:3971// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3972// CHECK-64: omp.loop.exit:3973// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])3974// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43975// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 03976// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3977// CHECK-64: .omp.final.then:3978// CHECK-64-NEXT: store i32 10, ptr [[I]], align 43979// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]3980// CHECK-64: .omp.final.done:3981// CHECK-64-NEXT: ret void3982//3983//3984// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined_omp_outlined3985// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {3986// CHECK-64-NEXT: entry:3987// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83988// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83989// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 83990// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 83991// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43992// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 43993// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43994// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43995// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43996// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43997// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 43998// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83999// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84000// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 84001// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 84002// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44003// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44004// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 84005// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i324006// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84007// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i324008// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 44009// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 44010// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44011// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44012// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44013// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44014// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84015// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 44016// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)4017// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]4018// CHECK-64: omp.dispatch.cond:4019// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])4020// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 04021// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]4022// CHECK-64: omp.dispatch.body:4023// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44024// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 44025// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4026// CHECK-64: omp.inner.for.cond:4027// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310:![0-9]+]]4028// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP310]]4029// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]4030// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4031// CHECK-64: omp.inner.for.body:4032// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310]]4033// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 14034// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4035// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP310]]4036// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4037// CHECK-64: omp.body.continue:4038// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4039// CHECK-64: omp.inner.for.inc:4040// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310]]4041// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 14042// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310]]4043// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP311:![0-9]+]]4044// CHECK-64: omp.inner.for.end:4045// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]4046// CHECK-64: omp.dispatch.inc:4047// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]4048// CHECK-64: omp.dispatch.end:4049// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])4050// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44051// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 04052// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4053// CHECK-64: .omp.final.then:4054// CHECK-64-NEXT: store i32 10, ptr [[I]], align 44055// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]4056// CHECK-64: .omp.final.done:4057// CHECK-64-NEXT: ret void4058//4059//4060// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l894061// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {4062// CHECK-64-NEXT: entry:4063// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 84064// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 44065// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 44066// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 84067// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_kernel_environment, ptr [[DYN_PTR]])4068// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -14069// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]4070// CHECK-64: user_code.entry:4071// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])4072// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 44073// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 44074// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]4075// CHECK-64-NEXT: call void @__kmpc_target_deinit()4076// CHECK-64-NEXT: ret void4077// CHECK-64: worker.exit:4078// CHECK-64-NEXT: ret void4079//4080//4081// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined4082// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {4083// CHECK-64-NEXT: entry:4084// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84085// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84086// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44087// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44088// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 44089// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 44090// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44091// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44092// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44093// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 84094// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84095// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84096// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 44097// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 44098// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44099// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44100// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()4101// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84102// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 44103// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])4104// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44105// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 94106// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4107// CHECK-64: cond.true:4108// CHECK-64-NEXT: br label [[COND_END:%.*]]4109// CHECK-64: cond.false:4110// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44111// CHECK-64-NEXT: br label [[COND_END]]4112// CHECK-64: cond.end:4113// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]4114// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 44115// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44116// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44117// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4118// CHECK-64: omp.inner.for.cond:4119// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313:![0-9]+]]4120// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 104121// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4122// CHECK-64: omp.inner.for.body:4123// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]4124// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i644125// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]4126// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i644127// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 04128// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr4129// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP313]]4130// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 14131// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr4132// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP313]]4133// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP313]]4134// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4135// CHECK-64: omp.inner.for.inc:4136// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313]]4137// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP313]]4138// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]4139// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313]]4140// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]4141// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP313]]4142// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]4143// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]4144// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]4145// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP313]]4146// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]4147// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]4148// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]4149// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 94150// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]4151// CHECK-64: cond.true5:4152// CHECK-64-NEXT: br label [[COND_END7:%.*]]4153// CHECK-64: cond.false6:4154// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]4155// CHECK-64-NEXT: br label [[COND_END7]]4156// CHECK-64: cond.end7:4157// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]4158// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]4159// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]4160// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313]]4161// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP314:![0-9]+]]4162// CHECK-64: omp.inner.for.end:4163// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4164// CHECK-64: omp.loop.exit:4165// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])4166// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44167// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 04168// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4169// CHECK-64: .omp.final.then:4170// CHECK-64-NEXT: store i32 10, ptr [[I]], align 44171// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]4172// CHECK-64: .omp.final.done:4173// CHECK-64-NEXT: ret void4174//4175//4176// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined_omp_outlined4177// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {4178// CHECK-64-NEXT: entry:4179// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84180// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84181// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 84182// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 84183// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44184// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44185// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44186// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44187// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44188// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44189// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44190// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84191// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84192// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 84193// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 84194// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44195// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44196// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 84197// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i324198// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84199// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i324200// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 44201// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 44202// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44203// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44204// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44205// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44206// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84207// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 44208// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)4209// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]4210// CHECK-64: omp.dispatch.cond:4211// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])4212// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 04213// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]4214// CHECK-64: omp.dispatch.body:4215// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44216// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 44217// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4218// CHECK-64: omp.inner.for.cond:4219// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316:![0-9]+]]4220// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP316]]4221// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]4222// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4223// CHECK-64: omp.inner.for.body:4224// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316]]4225// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 14226// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4227// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP316]]4228// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4229// CHECK-64: omp.body.continue:4230// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4231// CHECK-64: omp.inner.for.inc:4232// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316]]4233// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 14234// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316]]4235// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP317:![0-9]+]]4236// CHECK-64: omp.inner.for.end:4237// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]4238// CHECK-64: omp.dispatch.inc:4239// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]4240// CHECK-64: omp.dispatch.end:4241// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])4242// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44243// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 04244// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4245// CHECK-64: .omp.final.then:4246// CHECK-64-NEXT: store i32 10, ptr [[I]], align 44247// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]4248// CHECK-64: .omp.final.done:4249// CHECK-64-NEXT: ret void4250//4251//4252// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l934253// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {4254// CHECK-64-NEXT: entry:4255// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 84256// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 44257// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 44258// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 84259// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_kernel_environment, ptr [[DYN_PTR]])4260// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -14261// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]4262// CHECK-64: user_code.entry:4263// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])4264// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 44265// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 44266// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]4267// CHECK-64-NEXT: call void @__kmpc_target_deinit()4268// CHECK-64-NEXT: ret void4269// CHECK-64: worker.exit:4270// CHECK-64-NEXT: ret void4271//4272//4273// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined4274// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {4275// CHECK-64-NEXT: entry:4276// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84277// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84278// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44279// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44280// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 44281// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 44282// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44283// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44284// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44285// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 84286// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84287// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84288// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 44289// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 44290// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44291// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44292// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()4293// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84294// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 44295// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])4296// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44297// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 94298// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4299// CHECK-64: cond.true:4300// CHECK-64-NEXT: br label [[COND_END:%.*]]4301// CHECK-64: cond.false:4302// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44303// CHECK-64-NEXT: br label [[COND_END]]4304// CHECK-64: cond.end:4305// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]4306// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 44307// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44308// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44309// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4310// CHECK-64: omp.inner.for.cond:4311// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319:![0-9]+]]4312// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 104313// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4314// CHECK-64: omp.inner.for.body:4315// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]4316// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i644317// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]4318// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i644319// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 04320// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr4321// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8, !llvm.access.group [[ACC_GRP319]]4322// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 14323// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr4324// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 8, !llvm.access.group [[ACC_GRP319]]4325// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2), !llvm.access.group [[ACC_GRP319]]4326// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4327// CHECK-64: omp.inner.for.inc:4328// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319]]4329// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP319]]4330// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]4331// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319]]4332// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]4333// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP319]]4334// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]4335// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]4336// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]4337// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP319]]4338// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]4339// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]4340// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]4341// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 94342// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]4343// CHECK-64: cond.true5:4344// CHECK-64-NEXT: br label [[COND_END7:%.*]]4345// CHECK-64: cond.false6:4346// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]4347// CHECK-64-NEXT: br label [[COND_END7]]4348// CHECK-64: cond.end7:4349// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]4350// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]4351// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]4352// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319]]4353// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP320:![0-9]+]]4354// CHECK-64: omp.inner.for.end:4355// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4356// CHECK-64: omp.loop.exit:4357// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])4358// CHECK-64-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44359// CHECK-64-NEXT: [[TMP24:%.*]] = icmp ne i32 [[TMP23]], 04360// CHECK-64-NEXT: br i1 [[TMP24]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4361// CHECK-64: .omp.final.then:4362// CHECK-64-NEXT: store i32 10, ptr [[I]], align 44363// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]4364// CHECK-64: .omp.final.done:4365// CHECK-64-NEXT: ret void4366//4367//4368// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined_omp_outlined4369// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {4370// CHECK-64-NEXT: entry:4371// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84372// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84373// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 84374// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 84375// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44376// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44377// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44378// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44379// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44380// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44381// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44382// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84383// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84384// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 84385// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 84386// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44387// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44388// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 84389// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i324390// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84391// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i324392// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 44393// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 44394// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44395// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44396// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44397// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44398// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84399// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 44400// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)4401// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]4402// CHECK-64: omp.dispatch.cond:4403// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])4404// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 04405// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]4406// CHECK-64: omp.dispatch.body:4407// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44408// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 44409// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4410// CHECK-64: omp.inner.for.cond:4411// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322:![0-9]+]]4412// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP322]]4413// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]4414// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4415// CHECK-64: omp.inner.for.body:4416// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322]]4417// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 14418// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4419// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP322]]4420// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4421// CHECK-64: omp.body.continue:4422// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4423// CHECK-64: omp.inner.for.inc:4424// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322]]4425// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 14426// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322]]4427// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP323:![0-9]+]]4428// CHECK-64: omp.inner.for.end:4429// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]4430// CHECK-64: omp.dispatch.inc:4431// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]4432// CHECK-64: omp.dispatch.end:4433// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])4434// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44435// CHECK-64-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 04436// CHECK-64-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4437// CHECK-64: .omp.final.then:4438// CHECK-64-NEXT: store i32 10, ptr [[I]], align 44439// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]4440// CHECK-64: .omp.final.done:4441// CHECK-64-NEXT: ret void4442//4443//4444// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l974445// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {4446// CHECK-64-NEXT: entry:4447// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 84448// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 44449// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 44450// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 84451// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_kernel_environment, ptr [[DYN_PTR]])4452// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -14453// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]4454// CHECK-64: user_code.entry:4455// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])4456// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 44457// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 44458// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]4459// CHECK-64-NEXT: call void @__kmpc_target_deinit()4460// CHECK-64-NEXT: ret void4461// CHECK-64: worker.exit:4462// CHECK-64-NEXT: ret void4463//4464//4465// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined4466// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {4467// CHECK-64-NEXT: entry:4468// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84469// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84470// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44471// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44472// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 44473// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 44474// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44475// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44476// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44477// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 84478// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84479// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84480// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 44481// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 44482// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44483// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44484// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()4485// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84486// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 44487// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])4488// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44489// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 94490// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4491// CHECK-64: cond.true:4492// CHECK-64-NEXT: br label [[COND_END:%.*]]4493// CHECK-64: cond.false:4494// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44495// CHECK-64-NEXT: br label [[COND_END]]4496// CHECK-64: cond.end:4497// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]4498// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 44499// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44500// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44501// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4502// CHECK-64: omp.inner.for.cond:4503// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44504// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 104505// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4506// CHECK-64: omp.inner.for.body:4507// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44508// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i644509// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44510// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i644511// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 04512// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr4513// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 84514// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 14515// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr4516// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 84517// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)4518// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4519// CHECK-64: omp.inner.for.inc:4520// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44521// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44522// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]4523// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 44524// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44525// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44526// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]4527// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 44528// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44529// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44530// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]4531// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 44532// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44533// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 94534// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]4535// CHECK-64: cond.true5:4536// CHECK-64-NEXT: br label [[COND_END7:%.*]]4537// CHECK-64: cond.false6:4538// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44539// CHECK-64-NEXT: br label [[COND_END7]]4540// CHECK-64: cond.end7:4541// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]4542// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 44543// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44544// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 44545// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]4546// CHECK-64: omp.inner.for.end:4547// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4548// CHECK-64: omp.loop.exit:4549// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])4550// CHECK-64-NEXT: ret void4551//4552//4553// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined_omp_outlined4554// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {4555// CHECK-64-NEXT: entry:4556// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84557// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84558// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 84559// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 84560// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44561// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44562// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44563// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44564// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44565// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44566// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44567// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84568// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84569// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 84570// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 84571// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44572// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44573// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 84574// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i324575// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84576// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i324577// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 44578// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 44579// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44580// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44581// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84582// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 44583// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4584// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44585// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44586// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4587// CHECK-64: omp.inner.for.cond:4588// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44589// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i644590// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84591// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]4592// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4593// CHECK-64: omp.inner.for.body:4594// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44595// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 14596// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4597// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 44598// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4599// CHECK-64: omp.body.continue:4600// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4601// CHECK-64: omp.inner.for.inc:4602// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44603// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44604// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]4605// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 44606// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]4607// CHECK-64: omp.inner.for.end:4608// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4609// CHECK-64: omp.loop.exit:4610// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])4611// CHECK-64-NEXT: ret void4612//4613//4614// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1014615// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {4616// CHECK-64-NEXT: entry:4617// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 84618// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 44619// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 44620// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 84621// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_kernel_environment, ptr [[DYN_PTR]])4622// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -14623// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]4624// CHECK-64: user_code.entry:4625// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])4626// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 44627// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 44628// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]4629// CHECK-64-NEXT: call void @__kmpc_target_deinit()4630// CHECK-64-NEXT: ret void4631// CHECK-64: worker.exit:4632// CHECK-64-NEXT: ret void4633//4634//4635// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined4636// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {4637// CHECK-64-NEXT: entry:4638// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84639// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84640// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44641// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44642// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 44643// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 44644// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44645// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44646// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44647// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 84648// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84649// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84650// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 44651// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 44652// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44653// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44654// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()4655// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84656// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 44657// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])4658// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44659// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 94660// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4661// CHECK-64: cond.true:4662// CHECK-64-NEXT: br label [[COND_END:%.*]]4663// CHECK-64: cond.false:4664// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44665// CHECK-64-NEXT: br label [[COND_END]]4666// CHECK-64: cond.end:4667// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]4668// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 44669// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44670// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44671// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4672// CHECK-64: omp.inner.for.cond:4673// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44674// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 104675// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4676// CHECK-64: omp.inner.for.body:4677// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44678// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i644679// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44680// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i644681// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 04682// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr4683// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 84684// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 14685// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr4686// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 84687// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)4688// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4689// CHECK-64: omp.inner.for.inc:4690// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44691// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44692// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]4693// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 44694// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44695// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44696// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]4697// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 44698// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44699// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44700// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]4701// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 44702// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44703// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 94704// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]4705// CHECK-64: cond.true5:4706// CHECK-64-NEXT: br label [[COND_END7:%.*]]4707// CHECK-64: cond.false6:4708// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44709// CHECK-64-NEXT: br label [[COND_END7]]4710// CHECK-64: cond.end7:4711// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]4712// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 44713// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44714// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 44715// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]4716// CHECK-64: omp.inner.for.end:4717// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4718// CHECK-64: omp.loop.exit:4719// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])4720// CHECK-64-NEXT: ret void4721//4722//4723// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined_omp_outlined4724// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {4725// CHECK-64-NEXT: entry:4726// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84727// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84728// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 84729// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 84730// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44731// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44732// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44733// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44734// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44735// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44736// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44737// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84738// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84739// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 84740// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 84741// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44742// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44743// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 84744// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i324745// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84746// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i324747// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 44748// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 44749// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44750// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44751// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84752// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 44753// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4754// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44755// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 94756// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4757// CHECK-64: cond.true:4758// CHECK-64-NEXT: br label [[COND_END:%.*]]4759// CHECK-64: cond.false:4760// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44761// CHECK-64-NEXT: br label [[COND_END]]4762// CHECK-64: cond.end:4763// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]4764// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44765// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44766// CHECK-64-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 44767// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4768// CHECK-64: omp.inner.for.cond:4769// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44770// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44771// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]4772// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4773// CHECK-64: omp.inner.for.body:4774// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44775// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 14776// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4777// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 44778// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4779// CHECK-64: omp.body.continue:4780// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4781// CHECK-64: omp.inner.for.inc:4782// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44783// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 14784// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 44785// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]4786// CHECK-64: omp.inner.for.end:4787// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4788// CHECK-64: omp.loop.exit:4789// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])4790// CHECK-64-NEXT: ret void4791//4792//4793// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1054794// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {4795// CHECK-64-NEXT: entry:4796// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 84797// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 44798// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 44799// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 84800// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_kernel_environment, ptr [[DYN_PTR]])4801// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -14802// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]4803// CHECK-64: user_code.entry:4804// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])4805// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 44806// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 44807// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]4808// CHECK-64-NEXT: call void @__kmpc_target_deinit()4809// CHECK-64-NEXT: ret void4810// CHECK-64: worker.exit:4811// CHECK-64-NEXT: ret void4812//4813//4814// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined4815// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {4816// CHECK-64-NEXT: entry:4817// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84818// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84819// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44820// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44821// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 44822// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 44823// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44824// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44825// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44826// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 84827// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84828// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84829// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 44830// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 44831// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44832// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44833// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()4834// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84835// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 44836// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])4837// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44838// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 94839// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4840// CHECK-64: cond.true:4841// CHECK-64-NEXT: br label [[COND_END:%.*]]4842// CHECK-64: cond.false:4843// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44844// CHECK-64-NEXT: br label [[COND_END]]4845// CHECK-64: cond.end:4846// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]4847// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 44848// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44849// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44850// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4851// CHECK-64: omp.inner.for.cond:4852// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44853// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 104854// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4855// CHECK-64: omp.inner.for.body:4856// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44857// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i644858// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44859// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i644860// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 04861// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr4862// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 84863// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 14864// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr4865// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 84866// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)4867// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4868// CHECK-64: omp.inner.for.inc:4869// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44870// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44871// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]4872// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 44873// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44874// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44875// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]4876// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 44877// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44878// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44879// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]4880// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 44881// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44882// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 94883// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]4884// CHECK-64: cond.true5:4885// CHECK-64-NEXT: br label [[COND_END7:%.*]]4886// CHECK-64: cond.false6:4887// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 44888// CHECK-64-NEXT: br label [[COND_END7]]4889// CHECK-64: cond.end7:4890// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]4891// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 44892// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 44893// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 44894// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]4895// CHECK-64: omp.inner.for.end:4896// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4897// CHECK-64: omp.loop.exit:4898// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])4899// CHECK-64-NEXT: ret void4900//4901//4902// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined_omp_outlined4903// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {4904// CHECK-64-NEXT: entry:4905// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84906// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84907// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 84908// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 84909// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44910// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44911// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44912// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44913// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44914// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44915// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44916// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84917// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84918// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 84919// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 84920// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44921// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44922// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 84923// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i324924// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84925// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i324926// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 44927// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 44928// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44929// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44930// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84931// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 44932// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4933// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44934// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 44935// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4936// CHECK-64: omp.inner.for.cond:4937// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44938// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i644939// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 84940// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]4941// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4942// CHECK-64: omp.inner.for.body:4943// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44944// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 14945// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4946// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 44947// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4948// CHECK-64: omp.body.continue:4949// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4950// CHECK-64: omp.inner.for.inc:4951// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44952// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 44953// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]4954// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 44955// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]4956// CHECK-64: omp.inner.for.end:4957// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4958// CHECK-64: omp.loop.exit:4959// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])4960// CHECK-64-NEXT: ret void4961//4962//4963// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1094964// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {4965// CHECK-64-NEXT: entry:4966// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 84967// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 44968// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 44969// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 84970// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_kernel_environment, ptr [[DYN_PTR]])4971// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -14972// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]4973// CHECK-64: user_code.entry:4974// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])4975// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 44976// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 44977// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]4978// CHECK-64-NEXT: call void @__kmpc_target_deinit()4979// CHECK-64-NEXT: ret void4980// CHECK-64: worker.exit:4981// CHECK-64-NEXT: ret void4982//4983//4984// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined4985// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {4986// CHECK-64-NEXT: entry:4987// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84988// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84989// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44990// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 44991// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 44992// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 44993// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44994// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44995// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 44996// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 84997// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84998// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84999// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 45000// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 45001// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45002// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45003// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()5004// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85005// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 45006// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])5007// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45008// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 95009// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5010// CHECK-64: cond.true:5011// CHECK-64-NEXT: br label [[COND_END:%.*]]5012// CHECK-64: cond.false:5013// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45014// CHECK-64-NEXT: br label [[COND_END]]5015// CHECK-64: cond.end:5016// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]5017// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 45018// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45019// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45020// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5021// CHECK-64: omp.inner.for.cond:5022// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45023// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 105024// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5025// CHECK-64: omp.inner.for.body:5026// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45027// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i645028// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45029// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i645030// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 05031// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr5032// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 85033// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 15034// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr5035// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 85036// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)5037// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5038// CHECK-64: omp.inner.for.inc:5039// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45040// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45041// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]5042// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 45043// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45044// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45045// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]5046// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 45047// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45048// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45049// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]5050// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 45051// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45052// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 95053// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]5054// CHECK-64: cond.true5:5055// CHECK-64-NEXT: br label [[COND_END7:%.*]]5056// CHECK-64: cond.false6:5057// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45058// CHECK-64-NEXT: br label [[COND_END7]]5059// CHECK-64: cond.end7:5060// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]5061// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 45062// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45063// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 45064// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5065// CHECK-64: omp.inner.for.end:5066// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5067// CHECK-64: omp.loop.exit:5068// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])5069// CHECK-64-NEXT: ret void5070//5071//5072// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined_omp_outlined5073// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {5074// CHECK-64-NEXT: entry:5075// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85076// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85077// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 85078// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 85079// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45080// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45081// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45082// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45083// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45084// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45085// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45086// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85087// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85088// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 85089// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 85090// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45091// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45092// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 85093// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i325094// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85095// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i325096// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 45097// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 45098// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45099// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45100// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45101// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45102// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85103// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 45104// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)5105// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]5106// CHECK-64: omp.dispatch.cond:5107// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])5108// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 05109// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]5110// CHECK-64: omp.dispatch.body:5111// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45112// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 45113// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5114// CHECK-64: omp.inner.for.cond:5115// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325:![0-9]+]]5116// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP325]]5117// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]5118// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5119// CHECK-64: omp.inner.for.body:5120// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325]]5121// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 15122// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5123// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP325]]5124// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5125// CHECK-64: omp.body.continue:5126// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5127// CHECK-64: omp.inner.for.inc:5128// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325]]5129// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 15130// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325]]5131// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP326:![0-9]+]]5132// CHECK-64: omp.inner.for.end:5133// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]5134// CHECK-64: omp.dispatch.inc:5135// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]5136// CHECK-64: omp.dispatch.end:5137// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])5138// CHECK-64-NEXT: ret void5139//5140//5141// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1135142// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {5143// CHECK-64-NEXT: entry:5144// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 85145// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 45146// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 45147// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 85148// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_kernel_environment, ptr [[DYN_PTR]])5149// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -15150// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]5151// CHECK-64: user_code.entry:5152// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])5153// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 45154// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 45155// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]5156// CHECK-64-NEXT: call void @__kmpc_target_deinit()5157// CHECK-64-NEXT: ret void5158// CHECK-64: worker.exit:5159// CHECK-64-NEXT: ret void5160//5161//5162// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined5163// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {5164// CHECK-64-NEXT: entry:5165// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85166// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85167// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45168// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45169// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 45170// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 45171// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45172// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45173// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45174// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 85175// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85176// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85177// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 45178// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 45179// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45180// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45181// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()5182// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85183// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 45184// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])5185// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45186// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 95187// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5188// CHECK-64: cond.true:5189// CHECK-64-NEXT: br label [[COND_END:%.*]]5190// CHECK-64: cond.false:5191// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45192// CHECK-64-NEXT: br label [[COND_END]]5193// CHECK-64: cond.end:5194// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]5195// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 45196// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45197// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45198// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5199// CHECK-64: omp.inner.for.cond:5200// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45201// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 105202// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5203// CHECK-64: omp.inner.for.body:5204// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45205// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i645206// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45207// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i645208// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 05209// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr5210// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 85211// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 15212// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr5213// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 85214// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)5215// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5216// CHECK-64: omp.inner.for.inc:5217// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45218// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45219// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]5220// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 45221// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45222// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45223// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]5224// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 45225// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45226// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45227// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]5228// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 45229// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45230// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 95231// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]5232// CHECK-64: cond.true5:5233// CHECK-64-NEXT: br label [[COND_END7:%.*]]5234// CHECK-64: cond.false6:5235// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45236// CHECK-64-NEXT: br label [[COND_END7]]5237// CHECK-64: cond.end7:5238// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]5239// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 45240// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45241// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 45242// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5243// CHECK-64: omp.inner.for.end:5244// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5245// CHECK-64: omp.loop.exit:5246// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])5247// CHECK-64-NEXT: ret void5248//5249//5250// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined_omp_outlined5251// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {5252// CHECK-64-NEXT: entry:5253// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85254// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85255// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 85256// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 85257// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45258// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45259// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45260// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45261// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45262// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45263// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45264// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85265// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85266// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 85267// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 85268// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45269// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45270// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 85271// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i325272// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85273// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i325274// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 45275// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 45276// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45277// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45278// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45279// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45280// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85281// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 45282// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)5283// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]5284// CHECK-64: omp.dispatch.cond:5285// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])5286// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 05287// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]5288// CHECK-64: omp.dispatch.body:5289// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45290// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 45291// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5292// CHECK-64: omp.inner.for.cond:5293// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328:![0-9]+]]5294// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP328]]5295// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]5296// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5297// CHECK-64: omp.inner.for.body:5298// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328]]5299// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 15300// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5301// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP328]]5302// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5303// CHECK-64: omp.body.continue:5304// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5305// CHECK-64: omp.inner.for.inc:5306// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328]]5307// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 15308// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328]]5309// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP329:![0-9]+]]5310// CHECK-64: omp.inner.for.end:5311// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]5312// CHECK-64: omp.dispatch.inc:5313// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]5314// CHECK-64: omp.dispatch.end:5315// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])5316// CHECK-64-NEXT: ret void5317//5318//5319// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1175320// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {5321// CHECK-64-NEXT: entry:5322// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 85323// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 45324// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 45325// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 85326// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_kernel_environment, ptr [[DYN_PTR]])5327// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -15328// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]5329// CHECK-64: user_code.entry:5330// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])5331// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 45332// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 45333// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]5334// CHECK-64-NEXT: call void @__kmpc_target_deinit()5335// CHECK-64-NEXT: ret void5336// CHECK-64: worker.exit:5337// CHECK-64-NEXT: ret void5338//5339//5340// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined5341// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {5342// CHECK-64-NEXT: entry:5343// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85344// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85345// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45346// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45347// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 45348// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 45349// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45350// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45351// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45352// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 85353// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85354// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85355// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 45356// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 45357// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45358// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45359// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()5360// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85361// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 45362// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])5363// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45364// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 95365// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5366// CHECK-64: cond.true:5367// CHECK-64-NEXT: br label [[COND_END:%.*]]5368// CHECK-64: cond.false:5369// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45370// CHECK-64-NEXT: br label [[COND_END]]5371// CHECK-64: cond.end:5372// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]5373// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 45374// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45375// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45376// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5377// CHECK-64: omp.inner.for.cond:5378// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45379// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 105380// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5381// CHECK-64: omp.inner.for.body:5382// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45383// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i645384// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45385// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i645386// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 05387// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr5388// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 85389// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 15390// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr5391// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 85392// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)5393// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5394// CHECK-64: omp.inner.for.inc:5395// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45396// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45397// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]5398// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 45399// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45400// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45401// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]5402// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 45403// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45404// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45405// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]5406// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 45407// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45408// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 95409// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]5410// CHECK-64: cond.true5:5411// CHECK-64-NEXT: br label [[COND_END7:%.*]]5412// CHECK-64: cond.false6:5413// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45414// CHECK-64-NEXT: br label [[COND_END7]]5415// CHECK-64: cond.end7:5416// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]5417// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 45418// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45419// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 45420// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5421// CHECK-64: omp.inner.for.end:5422// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5423// CHECK-64: omp.loop.exit:5424// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])5425// CHECK-64-NEXT: ret void5426//5427//5428// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined_omp_outlined5429// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {5430// CHECK-64-NEXT: entry:5431// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85432// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85433// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 85434// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 85435// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45436// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45437// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45438// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45439// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45440// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45441// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45442// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85443// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85444// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 85445// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 85446// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45447// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45448// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 85449// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i325450// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85451// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i325452// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 45453// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 45454// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45455// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45456// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45457// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45458// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85459// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 45460// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)5461// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]5462// CHECK-64: omp.dispatch.cond:5463// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])5464// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 05465// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]5466// CHECK-64: omp.dispatch.body:5467// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45468// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 45469// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5470// CHECK-64: omp.inner.for.cond:5471// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331:![0-9]+]]5472// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP331]]5473// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]5474// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5475// CHECK-64: omp.inner.for.body:5476// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331]]5477// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 15478// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5479// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP331]]5480// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5481// CHECK-64: omp.body.continue:5482// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5483// CHECK-64: omp.inner.for.inc:5484// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331]]5485// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 15486// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331]]5487// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP332:![0-9]+]]5488// CHECK-64: omp.inner.for.end:5489// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]5490// CHECK-64: omp.dispatch.inc:5491// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]5492// CHECK-64: omp.dispatch.end:5493// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])5494// CHECK-64-NEXT: ret void5495//5496//5497// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1215498// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {5499// CHECK-64-NEXT: entry:5500// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 85501// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 45502// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 45503// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 85504// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_kernel_environment, ptr [[DYN_PTR]])5505// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -15506// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]5507// CHECK-64: user_code.entry:5508// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])5509// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 45510// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 45511// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]5512// CHECK-64-NEXT: call void @__kmpc_target_deinit()5513// CHECK-64-NEXT: ret void5514// CHECK-64: worker.exit:5515// CHECK-64-NEXT: ret void5516//5517//5518// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined5519// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {5520// CHECK-64-NEXT: entry:5521// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85522// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85523// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45524// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45525// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 45526// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 45527// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45528// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45529// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45530// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 85531// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85532// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85533// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 45534// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 45535// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45536// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45537// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()5538// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85539// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 45540// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])5541// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45542// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 95543// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5544// CHECK-64: cond.true:5545// CHECK-64-NEXT: br label [[COND_END:%.*]]5546// CHECK-64: cond.false:5547// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45548// CHECK-64-NEXT: br label [[COND_END]]5549// CHECK-64: cond.end:5550// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]5551// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 45552// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45553// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45554// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5555// CHECK-64: omp.inner.for.cond:5556// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45557// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 105558// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5559// CHECK-64: omp.inner.for.body:5560// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45561// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i645562// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45563// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i645564// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 05565// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr5566// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 85567// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 15568// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr5569// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 85570// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)5571// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5572// CHECK-64: omp.inner.for.inc:5573// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45574// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45575// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]5576// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 45577// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45578// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45579// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]5580// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 45581// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45582// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45583// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]5584// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 45585// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45586// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 95587// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]5588// CHECK-64: cond.true5:5589// CHECK-64-NEXT: br label [[COND_END7:%.*]]5590// CHECK-64: cond.false6:5591// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45592// CHECK-64-NEXT: br label [[COND_END7]]5593// CHECK-64: cond.end7:5594// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]5595// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 45596// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45597// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 45598// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5599// CHECK-64: omp.inner.for.end:5600// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5601// CHECK-64: omp.loop.exit:5602// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])5603// CHECK-64-NEXT: ret void5604//5605//5606// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined_omp_outlined5607// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {5608// CHECK-64-NEXT: entry:5609// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85610// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85611// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 85612// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 85613// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45614// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45615// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45616// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45617// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45618// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45619// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45620// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85621// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85622// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 85623// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 85624// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45625// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45626// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 85627// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i325628// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85629// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i325630// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 45631// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 45632// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45633// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45634// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45635// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45636// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85637// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 45638// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)5639// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]5640// CHECK-64: omp.dispatch.cond:5641// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])5642// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 05643// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]5644// CHECK-64: omp.dispatch.body:5645// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45646// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 45647// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5648// CHECK-64: omp.inner.for.cond:5649// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP334:![0-9]+]]5650// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP334]]5651// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]5652// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5653// CHECK-64: omp.inner.for.body:5654// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP334]]5655// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 15656// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5657// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP334]]5658// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5659// CHECK-64: omp.body.continue:5660// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5661// CHECK-64: omp.inner.for.inc:5662// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP334]]5663// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 15664// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP334]]5665// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP335:![0-9]+]]5666// CHECK-64: omp.inner.for.end:5667// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]5668// CHECK-64: omp.dispatch.inc:5669// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]5670// CHECK-64: omp.dispatch.end:5671// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])5672// CHECK-64-NEXT: ret void5673//5674//5675// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1255676// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {5677// CHECK-64-NEXT: entry:5678// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 85679// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 45680// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 45681// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 85682// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l125_kernel_environment, ptr [[DYN_PTR]])5683// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -15684// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]5685// CHECK-64: user_code.entry:5686// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])5687// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 45688// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 45689// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l125_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]5690// CHECK-64-NEXT: call void @__kmpc_target_deinit()5691// CHECK-64-NEXT: ret void5692// CHECK-64: worker.exit:5693// CHECK-64-NEXT: ret void5694//5695//5696// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l125_omp_outlined5697// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {5698// CHECK-64-NEXT: entry:5699// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85700// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85701// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45702// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45703// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 45704// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 45705// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45706// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45707// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45708// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 85709// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85710// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85711// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 45712// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 45713// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45714// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45715// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()5716// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85717// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 45718// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])5719// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45720// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 95721// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5722// CHECK-64: cond.true:5723// CHECK-64-NEXT: br label [[COND_END:%.*]]5724// CHECK-64: cond.false:5725// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45726// CHECK-64-NEXT: br label [[COND_END]]5727// CHECK-64: cond.end:5728// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]5729// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 45730// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45731// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45732// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5733// CHECK-64: omp.inner.for.cond:5734// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45735// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 105736// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5737// CHECK-64: omp.inner.for.body:5738// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45739// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i645740// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45741// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i645742// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 05743// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr5744// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 85745// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 15746// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr5747// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 85748// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l125_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)5749// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5750// CHECK-64: omp.inner.for.inc:5751// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45752// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45753// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]5754// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 45755// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45756// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45757// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]5758// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 45759// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45760// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45761// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]5762// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 45763// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45764// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 95765// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]5766// CHECK-64: cond.true5:5767// CHECK-64-NEXT: br label [[COND_END7:%.*]]5768// CHECK-64: cond.false6:5769// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45770// CHECK-64-NEXT: br label [[COND_END7]]5771// CHECK-64: cond.end7:5772// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]5773// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 45774// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45775// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 45776// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5777// CHECK-64: omp.inner.for.end:5778// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5779// CHECK-64: omp.loop.exit:5780// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])5781// CHECK-64-NEXT: ret void5782//5783//5784// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l125_omp_outlined_omp_outlined5785// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {5786// CHECK-64-NEXT: entry:5787// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85788// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85789// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 85790// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 85791// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45792// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45793// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45794// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45795// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45796// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45797// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45798// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85799// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85800// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 85801// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 85802// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45803// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45804// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 85805// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i325806// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85807// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i325808// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 45809// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 45810// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45811// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45812// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85813// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 45814// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)5815// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45816// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45817// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5818// CHECK-64: omp.inner.for.cond:5819// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45820// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i645821// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85822// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]5823// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5824// CHECK-64: omp.inner.for.body:5825// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45826// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 15827// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5828// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 45829// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5830// CHECK-64: omp.body.continue:5831// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5832// CHECK-64: omp.inner.for.inc:5833// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45834// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45835// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]5836// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 45837// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5838// CHECK-64: omp.inner.for.end:5839// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5840// CHECK-64: omp.loop.exit:5841// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])5842// CHECK-64-NEXT: ret void5843//5844//5845// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1305846// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {5847// CHECK-64-NEXT: entry:5848// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 85849// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 45850// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 45851// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 85852// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l130_kernel_environment, ptr [[DYN_PTR]])5853// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -15854// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]5855// CHECK-64: user_code.entry:5856// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])5857// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 45858// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 45859// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l130_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]5860// CHECK-64-NEXT: call void @__kmpc_target_deinit()5861// CHECK-64-NEXT: ret void5862// CHECK-64: worker.exit:5863// CHECK-64-NEXT: ret void5864//5865//5866// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l130_omp_outlined5867// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {5868// CHECK-64-NEXT: entry:5869// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85870// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85871// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45872// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45873// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 45874// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 45875// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45876// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45877// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45878// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 85879// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85880// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85881// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 45882// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 45883// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45884// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45885// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()5886// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85887// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 45888// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])5889// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45890// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 95891// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5892// CHECK-64: cond.true:5893// CHECK-64-NEXT: br label [[COND_END:%.*]]5894// CHECK-64: cond.false:5895// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45896// CHECK-64-NEXT: br label [[COND_END]]5897// CHECK-64: cond.end:5898// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]5899// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 45900// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45901// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 45902// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5903// CHECK-64: omp.inner.for.cond:5904// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45905// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 105906// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5907// CHECK-64: omp.inner.for.body:5908// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45909// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i645910// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45911// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i645912// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 05913// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr5914// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 85915// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 15916// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr5917// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 85918// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l130_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)5919// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5920// CHECK-64: omp.inner.for.inc:5921// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45922// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45923// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]5924// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 45925// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45926// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45927// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]5928// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 45929// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45930// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 45931// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]5932// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 45933// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45934// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 95935// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]5936// CHECK-64: cond.true5:5937// CHECK-64-NEXT: br label [[COND_END7:%.*]]5938// CHECK-64: cond.false6:5939// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 45940// CHECK-64-NEXT: br label [[COND_END7]]5941// CHECK-64: cond.end7:5942// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]5943// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 45944// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 45945// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 45946// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]5947// CHECK-64: omp.inner.for.end:5948// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]5949// CHECK-64: omp.loop.exit:5950// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])5951// CHECK-64-NEXT: ret void5952//5953//5954// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l130_omp_outlined_omp_outlined5955// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {5956// CHECK-64-NEXT: entry:5957// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 85958// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 85959// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 85960// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 85961// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45962// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 45963// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45964// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45965// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 45966// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 45967// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 45968// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 85969// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 85970// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 85971// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 85972// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45973// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45974// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 85975// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i325976// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 85977// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i325978// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 45979// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 45980// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 45981// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 45982// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 85983// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 45984// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)5985// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45986// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 95987// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]5988// CHECK-64: cond.true:5989// CHECK-64-NEXT: br label [[COND_END:%.*]]5990// CHECK-64: cond.false:5991// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45992// CHECK-64-NEXT: br label [[COND_END]]5993// CHECK-64: cond.end:5994// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]5995// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 45996// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45997// CHECK-64-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 45998// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5999// CHECK-64: omp.inner.for.cond:6000// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46001// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46002// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]6003// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6004// CHECK-64: omp.inner.for.body:6005// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46006// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 16007// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6008// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 46009// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6010// CHECK-64: omp.body.continue:6011// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6012// CHECK-64: omp.inner.for.inc:6013// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46014// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 16015// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 46016// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6017// CHECK-64: omp.inner.for.end:6018// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6019// CHECK-64: omp.loop.exit:6020// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])6021// CHECK-64-NEXT: ret void6022//6023//6024// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1356025// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {6026// CHECK-64-NEXT: entry:6027// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 86028// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 46029// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 46030// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 86031// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l135_kernel_environment, ptr [[DYN_PTR]])6032// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -16033// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]6034// CHECK-64: user_code.entry:6035// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])6036// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 46037// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 46038// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l135_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]6039// CHECK-64-NEXT: call void @__kmpc_target_deinit()6040// CHECK-64-NEXT: ret void6041// CHECK-64: worker.exit:6042// CHECK-64-NEXT: ret void6043//6044//6045// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l135_omp_outlined6046// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {6047// CHECK-64-NEXT: entry:6048// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86049// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86050// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46051// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46052// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 46053// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 46054// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46055// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46056// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46057// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 86058// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86059// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86060// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 46061// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 46062// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46063// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46064// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()6065// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86066// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 46067// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])6068// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46069// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 96070// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]6071// CHECK-64: cond.true:6072// CHECK-64-NEXT: br label [[COND_END:%.*]]6073// CHECK-64: cond.false:6074// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46075// CHECK-64-NEXT: br label [[COND_END]]6076// CHECK-64: cond.end:6077// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]6078// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 46079// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46080// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46081// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6082// CHECK-64: omp.inner.for.cond:6083// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46084// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 106085// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6086// CHECK-64: omp.inner.for.body:6087// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46088// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i646089// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46090// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i646091// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 06092// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr6093// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 86094// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 16095// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr6096// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 86097// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l135_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)6098// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6099// CHECK-64: omp.inner.for.inc:6100// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46101// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46102// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]6103// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 46104// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46105// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46106// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]6107// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 46108// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46109// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46110// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]6111// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 46112// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46113// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 96114// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]6115// CHECK-64: cond.true5:6116// CHECK-64-NEXT: br label [[COND_END7:%.*]]6117// CHECK-64: cond.false6:6118// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46119// CHECK-64-NEXT: br label [[COND_END7]]6120// CHECK-64: cond.end7:6121// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]6122// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 46123// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46124// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 46125// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6126// CHECK-64: omp.inner.for.end:6127// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6128// CHECK-64: omp.loop.exit:6129// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])6130// CHECK-64-NEXT: ret void6131//6132//6133// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l135_omp_outlined_omp_outlined6134// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {6135// CHECK-64-NEXT: entry:6136// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86137// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86138// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 86139// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 86140// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46141// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46142// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 46143// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 46144// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46145// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46146// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46147// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86148// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86149// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 86150// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 86151// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 46152// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 46153// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 86154// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i326155// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 86156// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i326157// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 46158// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 46159// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46160// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46161// CHECK-64-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86162// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 46163// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)6164// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46165// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46166// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6167// CHECK-64: omp.inner.for.cond:6168// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46169// CHECK-64-NEXT: [[CONV2:%.*]] = sext i32 [[TMP5]] to i646170// CHECK-64-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 86171// CHECK-64-NEXT: [[CMP:%.*]] = icmp ule i64 [[CONV2]], [[TMP6]]6172// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6173// CHECK-64: omp.inner.for.body:6174// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46175// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 16176// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6177// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 46178// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6179// CHECK-64: omp.body.continue:6180// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6181// CHECK-64: omp.inner.for.inc:6182// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46183// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46184// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]6185// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 46186// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6187// CHECK-64: omp.inner.for.end:6188// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6189// CHECK-64: omp.loop.exit:6190// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])6191// CHECK-64-NEXT: ret void6192//6193//6194// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1406195// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {6196// CHECK-64-NEXT: entry:6197// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 86198// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 46199// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 46200// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 86201// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l140_kernel_environment, ptr [[DYN_PTR]])6202// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -16203// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]6204// CHECK-64: user_code.entry:6205// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])6206// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 46207// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 46208// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l140_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]6209// CHECK-64-NEXT: call void @__kmpc_target_deinit()6210// CHECK-64-NEXT: ret void6211// CHECK-64: worker.exit:6212// CHECK-64-NEXT: ret void6213//6214//6215// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l140_omp_outlined6216// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {6217// CHECK-64-NEXT: entry:6218// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86219// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86220// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46221// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46222// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 46223// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 46224// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46225// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46226// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46227// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 86228// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86229// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86230// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 46231// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 46232// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46233// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46234// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()6235// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86236// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 46237// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])6238// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46239// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 96240// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]6241// CHECK-64: cond.true:6242// CHECK-64-NEXT: br label [[COND_END:%.*]]6243// CHECK-64: cond.false:6244// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46245// CHECK-64-NEXT: br label [[COND_END]]6246// CHECK-64: cond.end:6247// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]6248// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 46249// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46250// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46251// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6252// CHECK-64: omp.inner.for.cond:6253// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46254// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 106255// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6256// CHECK-64: omp.inner.for.body:6257// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46258// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i646259// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46260// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i646261// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 06262// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr6263// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 86264// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 16265// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr6266// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 86267// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l140_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)6268// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6269// CHECK-64: omp.inner.for.inc:6270// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46271// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46272// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]6273// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 46274// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46275// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46276// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]6277// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 46278// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46279// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46280// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]6281// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 46282// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46283// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 96284// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]6285// CHECK-64: cond.true5:6286// CHECK-64-NEXT: br label [[COND_END7:%.*]]6287// CHECK-64: cond.false6:6288// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46289// CHECK-64-NEXT: br label [[COND_END7]]6290// CHECK-64: cond.end7:6291// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]6292// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 46293// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46294// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 46295// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6296// CHECK-64: omp.inner.for.end:6297// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6298// CHECK-64: omp.loop.exit:6299// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])6300// CHECK-64-NEXT: ret void6301//6302//6303// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l140_omp_outlined_omp_outlined6304// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {6305// CHECK-64-NEXT: entry:6306// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86307// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86308// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 86309// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 86310// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46311// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46312// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 46313// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 46314// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46315// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46316// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46317// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86318// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86319// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 86320// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 86321// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 46322// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 46323// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 86324// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i326325// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 86326// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i326327// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 46328// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 46329// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46330// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46331// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46332// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46333// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86334// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 46335// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)6336// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]6337// CHECK-64: omp.dispatch.cond:6338// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])6339// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 06340// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]6341// CHECK-64: omp.dispatch.body:6342// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46343// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 46344// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6345// CHECK-64: omp.inner.for.cond:6346// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP337:![0-9]+]]6347// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP337]]6348// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]6349// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6350// CHECK-64: omp.inner.for.body:6351// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP337]]6352// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 16353// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6354// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP337]]6355// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6356// CHECK-64: omp.body.continue:6357// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6358// CHECK-64: omp.inner.for.inc:6359// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP337]]6360// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 16361// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP337]]6362// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP338:![0-9]+]]6363// CHECK-64: omp.inner.for.end:6364// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]6365// CHECK-64: omp.dispatch.inc:6366// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]6367// CHECK-64: omp.dispatch.end:6368// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])6369// CHECK-64-NEXT: ret void6370//6371//6372// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1456373// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {6374// CHECK-64-NEXT: entry:6375// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 86376// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 46377// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 46378// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 86379// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l145_kernel_environment, ptr [[DYN_PTR]])6380// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -16381// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]6382// CHECK-64: user_code.entry:6383// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])6384// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 46385// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 46386// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l145_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]6387// CHECK-64-NEXT: call void @__kmpc_target_deinit()6388// CHECK-64-NEXT: ret void6389// CHECK-64: worker.exit:6390// CHECK-64-NEXT: ret void6391//6392//6393// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l145_omp_outlined6394// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {6395// CHECK-64-NEXT: entry:6396// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86397// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86398// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46399// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46400// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 46401// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 46402// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46403// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46404// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46405// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 86406// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86407// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86408// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 46409// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 46410// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46411// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46412// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()6413// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86414// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 46415// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])6416// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46417// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 96418// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]6419// CHECK-64: cond.true:6420// CHECK-64-NEXT: br label [[COND_END:%.*]]6421// CHECK-64: cond.false:6422// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46423// CHECK-64-NEXT: br label [[COND_END]]6424// CHECK-64: cond.end:6425// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]6426// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 46427// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46428// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46429// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6430// CHECK-64: omp.inner.for.cond:6431// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46432// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 106433// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6434// CHECK-64: omp.inner.for.body:6435// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46436// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i646437// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46438// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i646439// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 06440// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr6441// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 86442// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 16443// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr6444// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 86445// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l145_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)6446// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6447// CHECK-64: omp.inner.for.inc:6448// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46449// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46450// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]6451// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 46452// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46453// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46454// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]6455// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 46456// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46457// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46458// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]6459// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 46460// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46461// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 96462// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]6463// CHECK-64: cond.true5:6464// CHECK-64-NEXT: br label [[COND_END7:%.*]]6465// CHECK-64: cond.false6:6466// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46467// CHECK-64-NEXT: br label [[COND_END7]]6468// CHECK-64: cond.end7:6469// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]6470// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 46471// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46472// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 46473// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6474// CHECK-64: omp.inner.for.end:6475// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6476// CHECK-64: omp.loop.exit:6477// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])6478// CHECK-64-NEXT: ret void6479//6480//6481// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l145_omp_outlined_omp_outlined6482// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {6483// CHECK-64-NEXT: entry:6484// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86485// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86486// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 86487// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 86488// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46489// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46490// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 46491// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 46492// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46493// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46494// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46495// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86496// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86497// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 86498// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 86499// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 46500// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 46501// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 86502// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i326503// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 86504// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i326505// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 46506// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 46507// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46508// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46509// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46510// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46511// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86512// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 46513// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)6514// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]6515// CHECK-64: omp.dispatch.cond:6516// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])6517// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 06518// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]6519// CHECK-64: omp.dispatch.body:6520// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46521// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 46522// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6523// CHECK-64: omp.inner.for.cond:6524// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP340:![0-9]+]]6525// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP340]]6526// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]6527// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6528// CHECK-64: omp.inner.for.body:6529// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP340]]6530// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 16531// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6532// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP340]]6533// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6534// CHECK-64: omp.body.continue:6535// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6536// CHECK-64: omp.inner.for.inc:6537// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP340]]6538// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 16539// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP340]]6540// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP341:![0-9]+]]6541// CHECK-64: omp.inner.for.end:6542// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]6543// CHECK-64: omp.dispatch.inc:6544// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]6545// CHECK-64: omp.dispatch.end:6546// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])6547// CHECK-64-NEXT: ret void6548//6549//6550// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1506551// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {6552// CHECK-64-NEXT: entry:6553// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 86554// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 46555// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 46556// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 86557// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l150_kernel_environment, ptr [[DYN_PTR]])6558// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -16559// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]6560// CHECK-64: user_code.entry:6561// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])6562// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 46563// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 46564// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l150_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]6565// CHECK-64-NEXT: call void @__kmpc_target_deinit()6566// CHECK-64-NEXT: ret void6567// CHECK-64: worker.exit:6568// CHECK-64-NEXT: ret void6569//6570//6571// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l150_omp_outlined6572// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {6573// CHECK-64-NEXT: entry:6574// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86575// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86576// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46577// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46578// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 46579// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 46580// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46581// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46582// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46583// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 86584// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86585// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86586// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 46587// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 46588// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46589// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46590// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()6591// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86592// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 46593// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])6594// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46595// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 96596// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]6597// CHECK-64: cond.true:6598// CHECK-64-NEXT: br label [[COND_END:%.*]]6599// CHECK-64: cond.false:6600// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46601// CHECK-64-NEXT: br label [[COND_END]]6602// CHECK-64: cond.end:6603// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]6604// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 46605// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46606// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46607// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6608// CHECK-64: omp.inner.for.cond:6609// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46610// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 106611// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6612// CHECK-64: omp.inner.for.body:6613// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46614// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i646615// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46616// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i646617// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 06618// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr6619// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 86620// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 16621// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr6622// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 86623// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l150_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)6624// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6625// CHECK-64: omp.inner.for.inc:6626// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46627// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46628// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]6629// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 46630// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46631// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46632// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]6633// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 46634// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46635// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46636// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]6637// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 46638// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46639// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 96640// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]6641// CHECK-64: cond.true5:6642// CHECK-64-NEXT: br label [[COND_END7:%.*]]6643// CHECK-64: cond.false6:6644// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46645// CHECK-64-NEXT: br label [[COND_END7]]6646// CHECK-64: cond.end7:6647// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]6648// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 46649// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46650// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 46651// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6652// CHECK-64: omp.inner.for.end:6653// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6654// CHECK-64: omp.loop.exit:6655// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])6656// CHECK-64-NEXT: ret void6657//6658//6659// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l150_omp_outlined_omp_outlined6660// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {6661// CHECK-64-NEXT: entry:6662// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86663// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86664// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 86665// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 86666// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46667// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46668// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 46669// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 46670// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46671// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46672// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46673// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86674// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86675// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 86676// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 86677// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 46678// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 46679// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 86680// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i326681// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 86682// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i326683// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 46684// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 46685// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46686// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46687// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46688// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46689// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86690// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 46691// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)6692// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]6693// CHECK-64: omp.dispatch.cond:6694// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])6695// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 06696// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]6697// CHECK-64: omp.dispatch.body:6698// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46699// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 46700// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6701// CHECK-64: omp.inner.for.cond:6702// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP343:![0-9]+]]6703// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP343]]6704// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]6705// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6706// CHECK-64: omp.inner.for.body:6707// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP343]]6708// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 16709// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6710// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP343]]6711// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6712// CHECK-64: omp.body.continue:6713// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6714// CHECK-64: omp.inner.for.inc:6715// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP343]]6716// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 16717// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP343]]6718// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP344:![0-9]+]]6719// CHECK-64: omp.inner.for.end:6720// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]6721// CHECK-64: omp.dispatch.inc:6722// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]6723// CHECK-64: omp.dispatch.end:6724// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])6725// CHECK-64-NEXT: ret void6726//6727//6728// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1556729// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {6730// CHECK-64-NEXT: entry:6731// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 86732// CHECK-64-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 46733// CHECK-64-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 46734// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 86735// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l155_kernel_environment, ptr [[DYN_PTR]])6736// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -16737// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]6738// CHECK-64: user_code.entry:6739// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])6740// CHECK-64-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 46741// CHECK-64-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 46742// CHECK-64-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l155_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]6743// CHECK-64-NEXT: call void @__kmpc_target_deinit()6744// CHECK-64-NEXT: ret void6745// CHECK-64: worker.exit:6746// CHECK-64-NEXT: ret void6747//6748//6749// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l155_omp_outlined6750// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {6751// CHECK-64-NEXT: entry:6752// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86753// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86754// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46755// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46756// CHECK-64-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 46757// CHECK-64-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 46758// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46759// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46760// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46761// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 86762// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86763// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86764// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 46765// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 46766// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46767// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46768// CHECK-64-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()6769// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86770// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 46771// CHECK-64-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])6772// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46773// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 96774// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]6775// CHECK-64: cond.true:6776// CHECK-64-NEXT: br label [[COND_END:%.*]]6777// CHECK-64: cond.false:6778// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46779// CHECK-64-NEXT: br label [[COND_END]]6780// CHECK-64: cond.end:6781// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]6782// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 46783// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46784// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46785// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6786// CHECK-64: omp.inner.for.cond:6787// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46788// CHECK-64-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 106789// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6790// CHECK-64: omp.inner.for.body:6791// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46792// CHECK-64-NEXT: [[TMP7:%.*]] = zext i32 [[TMP6]] to i646793// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46794// CHECK-64-NEXT: [[TMP9:%.*]] = zext i32 [[TMP8]] to i646795// CHECK-64-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 06796// CHECK-64-NEXT: [[TMP11:%.*]] = inttoptr i64 [[TMP7]] to ptr6797// CHECK-64-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 86798// CHECK-64-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 16799// CHECK-64-NEXT: [[TMP13:%.*]] = inttoptr i64 [[TMP9]] to ptr6800// CHECK-64-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 86801// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l155_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)6802// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6803// CHECK-64: omp.inner.for.inc:6804// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46805// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46806// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]6807// CHECK-64-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 46808// CHECK-64-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46809// CHECK-64-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46810// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]6811// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 46812// CHECK-64-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46813// CHECK-64-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46814// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]6815// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 46816// CHECK-64-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46817// CHECK-64-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP20]], 96818// CHECK-64-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]6819// CHECK-64: cond.true5:6820// CHECK-64-NEXT: br label [[COND_END7:%.*]]6821// CHECK-64: cond.false6:6822// CHECK-64-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 46823// CHECK-64-NEXT: br label [[COND_END7]]6824// CHECK-64: cond.end7:6825// CHECK-64-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP21]], [[COND_FALSE6]] ]6826// CHECK-64-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 46827// CHECK-64-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 46828// CHECK-64-NEXT: store i32 [[TMP22]], ptr [[DOTOMP_IV]], align 46829// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6830// CHECK-64: omp.inner.for.end:6831// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]6832// CHECK-64: omp.loop.exit:6833// CHECK-64-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])6834// CHECK-64-NEXT: ret void6835//6836//6837// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l155_omp_outlined_omp_outlined6838// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[DOTPREVIOUS_LB_:%.*]], i64 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {6839// CHECK-64-NEXT: entry:6840// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86841// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86842// CHECK-64-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i64, align 86843// CHECK-64-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i64, align 86844// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46845// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46846// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 46847// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 46848// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46849// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46850// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46851// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86852// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86853// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 86854// CHECK-64-NEXT: store i64 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 86855// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 46856// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 46857// CHECK-64-NEXT: [[TMP0:%.*]] = load i64, ptr [[DOTPREVIOUS_LB__ADDR]], align 86858// CHECK-64-NEXT: [[CONV:%.*]] = trunc i64 [[TMP0]] to i326859// CHECK-64-NEXT: [[TMP1:%.*]] = load i64, ptr [[DOTPREVIOUS_UB__ADDR]], align 86860// CHECK-64-NEXT: [[CONV1:%.*]] = trunc i64 [[TMP1]] to i326861// CHECK-64-NEXT: store i32 [[CONV]], ptr [[DOTOMP_LB]], align 46862// CHECK-64-NEXT: store i32 [[CONV1]], ptr [[DOTOMP_UB]], align 46863// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46864// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46865// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46866// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46867// CHECK-64-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86868// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 46869// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)6870// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]6871// CHECK-64: omp.dispatch.cond:6872// CHECK-64-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])6873// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 06874// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]6875// CHECK-64: omp.dispatch.body:6876// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46877// CHECK-64-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 46878// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6879// CHECK-64: omp.inner.for.cond:6880// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP346:![0-9]+]]6881// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP346]]6882// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]6883// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6884// CHECK-64: omp.inner.for.body:6885// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP346]]6886// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 16887// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6888// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP346]]6889// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6890// CHECK-64: omp.body.continue:6891// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6892// CHECK-64: omp.inner.for.inc:6893// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP346]]6894// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 16895// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP346]]6896// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP347:![0-9]+]]6897// CHECK-64: omp.inner.for.end:6898// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]6899// CHECK-64: omp.dispatch.inc:6900// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]6901// CHECK-64: omp.dispatch.end:6902// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])6903// CHECK-64-NEXT: ret void6904//6905//6906// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1606907// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR8:[0-9]+]] {6908// CHECK-64-NEXT: entry:6909// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 86910// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 86911// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 86912// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 86913// CHECK-64-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 86914// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l160_kernel_environment, ptr [[DYN_PTR]])6915// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -16916// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]6917// CHECK-64: user_code.entry:6918// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])6919// CHECK-64-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 16920// CHECK-64-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i16921// CHECK-64-NEXT: [[TMP3:%.*]] = zext i1 [[TOBOOL]] to i326922// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 [[TMP3]], i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l160_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)6923// CHECK-64-NEXT: call void @__kmpc_target_deinit()6924// CHECK-64-NEXT: ret void6925// CHECK-64: worker.exit:6926// CHECK-64-NEXT: ret void6927//6928//6929// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l160_omp_outlined6930// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {6931// CHECK-64-NEXT: entry:6932// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 86933// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 86934// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 46935// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 46936// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 46937// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 46938// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 46939// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 46940// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 46941// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 86942// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 86943// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 46944// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 46945// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 46946// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 46947// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 86948// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 46949// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)6950// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]6951// CHECK-64: omp.dispatch.cond:6952// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46953// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 96954// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]6955// CHECK-64: cond.true:6956// CHECK-64-NEXT: br label [[COND_END:%.*]]6957// CHECK-64: cond.false:6958// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46959// CHECK-64-NEXT: br label [[COND_END]]6960// CHECK-64: cond.end:6961// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]6962// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 46963// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46964// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 46965// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46966// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46967// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]6968// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]6969// CHECK-64: omp.dispatch.body:6970// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]6971// CHECK-64: omp.inner.for.cond:6972// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46973// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46974// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]6975// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]6976// CHECK-64: omp.inner.for.body:6977// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46978// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 16979// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]6980// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 46981// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]6982// CHECK-64: omp.body.continue:6983// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]6984// CHECK-64: omp.inner.for.inc:6985// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 46986// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 16987// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 46988// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]6989// CHECK-64: omp.inner.for.end:6990// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]6991// CHECK-64: omp.dispatch.inc:6992// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 46993// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46994// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]6995// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 46996// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 46997// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 46998// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]6999// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 47000// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7001// CHECK-64: omp.dispatch.end:7002// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])7003// CHECK-64-NEXT: ret void7004//7005//7006// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1637007// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7008// CHECK-64-NEXT: entry:7009// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87010// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87011// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87012// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l163_kernel_environment, ptr [[DYN_PTR]])7013// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17014// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7015// CHECK-64: user_code.entry:7016// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7017// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l163_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7018// CHECK-64-NEXT: call void @__kmpc_target_deinit()7019// CHECK-64-NEXT: ret void7020// CHECK-64: worker.exit:7021// CHECK-64-NEXT: ret void7022//7023//7024// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l163_omp_outlined7025// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7026// CHECK-64-NEXT: entry:7027// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87028// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87029// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47030// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47031// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47032// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47033// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47034// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47035// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47036// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87037// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87038// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47039// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47040// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47041// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47042// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87043// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47044// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)7045// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47046// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 97047// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]7048// CHECK-64: cond.true:7049// CHECK-64-NEXT: br label [[COND_END:%.*]]7050// CHECK-64: cond.false:7051// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47052// CHECK-64-NEXT: br label [[COND_END]]7053// CHECK-64: cond.end:7054// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]7055// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 47056// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47057// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 47058// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7059// CHECK-64: omp.inner.for.cond:7060// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47061// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47062// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]7063// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7064// CHECK-64: omp.inner.for.body:7065// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47066// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 17067// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7068// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 47069// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7070// CHECK-64: omp.body.continue:7071// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7072// CHECK-64: omp.inner.for.inc:7073// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47074// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 17075// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 47076// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]7077// CHECK-64: omp.inner.for.end:7078// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]7079// CHECK-64: omp.loop.exit:7080// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])7081// CHECK-64-NEXT: ret void7082//7083//7084// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1667085// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7086// CHECK-64-NEXT: entry:7087// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87088// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87089// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87090// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l166_kernel_environment, ptr [[DYN_PTR]])7091// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17092// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7093// CHECK-64: user_code.entry:7094// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7095// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l166_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7096// CHECK-64-NEXT: call void @__kmpc_target_deinit()7097// CHECK-64-NEXT: ret void7098// CHECK-64: worker.exit:7099// CHECK-64-NEXT: ret void7100//7101//7102// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l166_omp_outlined7103// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7104// CHECK-64-NEXT: entry:7105// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87106// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87107// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47108// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47109// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47110// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47111// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47112// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47113// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47114// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87115// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87116// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47117// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47118// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47119// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47120// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87121// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47122// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)7123// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7124// CHECK-64: omp.dispatch.cond:7125// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47126// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 97127// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]7128// CHECK-64: cond.true:7129// CHECK-64-NEXT: br label [[COND_END:%.*]]7130// CHECK-64: cond.false:7131// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47132// CHECK-64-NEXT: br label [[COND_END]]7133// CHECK-64: cond.end:7134// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]7135// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 47136// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47137// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 47138// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47139// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47140// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]7141// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7142// CHECK-64: omp.dispatch.body:7143// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7144// CHECK-64: omp.inner.for.cond:7145// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47146// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47147// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]7148// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7149// CHECK-64: omp.inner.for.body:7150// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47151// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 17152// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7153// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 47154// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7155// CHECK-64: omp.body.continue:7156// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7157// CHECK-64: omp.inner.for.inc:7158// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47159// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 17160// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 47161// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]7162// CHECK-64: omp.inner.for.end:7163// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7164// CHECK-64: omp.dispatch.inc:7165// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47166// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 47167// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]7168// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 47169// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47170// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 47171// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]7172// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 47173// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7174// CHECK-64: omp.dispatch.end:7175// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])7176// CHECK-64-NEXT: ret void7177//7178//7179// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1697180// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7181// CHECK-64-NEXT: entry:7182// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87183// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87184// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87185// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l169_kernel_environment, ptr [[DYN_PTR]])7186// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17187// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7188// CHECK-64: user_code.entry:7189// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7190// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l169_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7191// CHECK-64-NEXT: call void @__kmpc_target_deinit()7192// CHECK-64-NEXT: ret void7193// CHECK-64: worker.exit:7194// CHECK-64-NEXT: ret void7195//7196//7197// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l169_omp_outlined7198// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7199// CHECK-64-NEXT: entry:7200// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87201// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87202// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47203// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47204// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47205// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47206// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47207// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47208// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47209// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87210// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87211// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47212// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47213// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47214// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47215// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87216// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47217// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741862, i32 0, i32 9, i32 1, i32 1)7218// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7219// CHECK-64: omp.dispatch.cond:7220// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7221// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07222// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7223// CHECK-64: omp.dispatch.body:7224// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47225// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47226// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7227// CHECK-64: omp.inner.for.cond:7228// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP349:![0-9]+]]7229// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP349]]7230// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7231// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7232// CHECK-64: omp.inner.for.body:7233// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP349]]7234// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17235// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7236// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP349]]7237// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7238// CHECK-64: omp.body.continue:7239// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7240// CHECK-64: omp.inner.for.inc:7241// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP349]]7242// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 17243// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP349]]7244// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP350:![0-9]+]]7245// CHECK-64: omp.inner.for.end:7246// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7247// CHECK-64: omp.dispatch.inc:7248// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7249// CHECK-64: omp.dispatch.end:7250// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])7251// CHECK-64-NEXT: ret void7252//7253//7254// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1727255// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7256// CHECK-64-NEXT: entry:7257// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87258// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87259// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87260// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l172_kernel_environment, ptr [[DYN_PTR]])7261// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17262// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7263// CHECK-64: user_code.entry:7264// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7265// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l172_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7266// CHECK-64-NEXT: call void @__kmpc_target_deinit()7267// CHECK-64-NEXT: ret void7268// CHECK-64: worker.exit:7269// CHECK-64-NEXT: ret void7270//7271//7272// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l172_omp_outlined7273// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7274// CHECK-64-NEXT: entry:7275// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87276// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87277// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47278// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47279// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47280// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47281// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47282// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47283// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47284// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87285// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87286// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47287// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47288// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47289// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47290// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87291// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47292// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741861, i32 0, i32 9, i32 1, i32 1)7293// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7294// CHECK-64: omp.dispatch.cond:7295// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7296// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07297// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7298// CHECK-64: omp.dispatch.body:7299// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47300// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47301// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7302// CHECK-64: omp.inner.for.cond:7303// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP352:![0-9]+]]7304// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP352]]7305// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7306// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7307// CHECK-64: omp.inner.for.body:7308// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP352]]7309// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17310// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7311// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP352]]7312// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7313// CHECK-64: omp.body.continue:7314// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7315// CHECK-64: omp.inner.for.inc:7316// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP352]]7317// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 17318// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP352]]7319// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP353:![0-9]+]]7320// CHECK-64: omp.inner.for.end:7321// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7322// CHECK-64: omp.dispatch.inc:7323// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7324// CHECK-64: omp.dispatch.end:7325// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])7326// CHECK-64-NEXT: ret void7327//7328//7329// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1757330// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7331// CHECK-64-NEXT: entry:7332// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87333// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87334// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87335// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l175_kernel_environment, ptr [[DYN_PTR]])7336// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17337// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7338// CHECK-64: user_code.entry:7339// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7340// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l175_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7341// CHECK-64-NEXT: call void @__kmpc_target_deinit()7342// CHECK-64-NEXT: ret void7343// CHECK-64: worker.exit:7344// CHECK-64-NEXT: ret void7345//7346//7347// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l175_omp_outlined7348// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7349// CHECK-64-NEXT: entry:7350// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87351// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87352// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47353// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47354// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47355// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47356// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47357// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47358// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47359// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87360// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87361// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47362// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47363// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47364// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47365// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87366// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47367// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741859, i32 0, i32 9, i32 1, i32 1)7368// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7369// CHECK-64: omp.dispatch.cond:7370// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7371// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07372// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7373// CHECK-64: omp.dispatch.body:7374// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47375// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47376// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7377// CHECK-64: omp.inner.for.cond:7378// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP355:![0-9]+]]7379// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP355]]7380// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7381// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7382// CHECK-64: omp.inner.for.body:7383// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP355]]7384// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17385// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7386// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP355]]7387// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7388// CHECK-64: omp.body.continue:7389// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7390// CHECK-64: omp.inner.for.inc:7391// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP355]]7392// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 17393// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP355]]7394// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP356:![0-9]+]]7395// CHECK-64: omp.inner.for.end:7396// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7397// CHECK-64: omp.dispatch.inc:7398// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7399// CHECK-64: omp.dispatch.end:7400// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])7401// CHECK-64-NEXT: ret void7402//7403//7404// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1787405// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7406// CHECK-64-NEXT: entry:7407// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87408// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87409// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87410// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l178_kernel_environment, ptr [[DYN_PTR]])7411// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17412// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7413// CHECK-64: user_code.entry:7414// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7415// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l178_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7416// CHECK-64-NEXT: call void @__kmpc_target_deinit()7417// CHECK-64-NEXT: ret void7418// CHECK-64: worker.exit:7419// CHECK-64-NEXT: ret void7420//7421//7422// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l178_omp_outlined7423// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7424// CHECK-64-NEXT: entry:7425// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87426// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87427// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47428// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47429// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47430// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47431// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47432// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47433// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47434// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87435// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87436// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47437// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47438// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47439// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47440// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87441// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47442// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741860, i32 0, i32 9, i32 1, i32 1)7443// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7444// CHECK-64: omp.dispatch.cond:7445// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7446// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07447// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7448// CHECK-64: omp.dispatch.body:7449// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47450// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47451// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7452// CHECK-64: omp.inner.for.cond:7453// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP358:![0-9]+]]7454// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP358]]7455// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7456// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7457// CHECK-64: omp.inner.for.body:7458// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP358]]7459// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17460// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7461// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP358]]7462// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7463// CHECK-64: omp.body.continue:7464// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7465// CHECK-64: omp.inner.for.inc:7466// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP358]]7467// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 17468// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP358]]7469// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP359:![0-9]+]]7470// CHECK-64: omp.inner.for.end:7471// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7472// CHECK-64: omp.dispatch.inc:7473// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7474// CHECK-64: omp.dispatch.end:7475// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])7476// CHECK-64-NEXT: ret void7477//7478//7479// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1817480// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR8]] {7481// CHECK-64-NEXT: entry:7482// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87483// CHECK-64-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 87484// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87485// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87486// CHECK-64-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 87487// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l181_kernel_environment, ptr [[DYN_PTR]])7488// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17489// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7490// CHECK-64: user_code.entry:7491// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7492// CHECK-64-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 17493// CHECK-64-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i17494// CHECK-64-NEXT: [[TMP3:%.*]] = zext i1 [[TOBOOL]] to i327495// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 [[TMP3]], i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l181_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7496// CHECK-64-NEXT: call void @__kmpc_target_deinit()7497// CHECK-64-NEXT: ret void7498// CHECK-64: worker.exit:7499// CHECK-64-NEXT: ret void7500//7501//7502// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l181_omp_outlined7503// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7504// CHECK-64-NEXT: entry:7505// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87506// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87507// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47508// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47509// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47510// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47511// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47512// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47513// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47514// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87515// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87516// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47517// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47518// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47519// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47520// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87521// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47522// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)7523// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7524// CHECK-64: omp.dispatch.cond:7525// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47526// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 97527// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]7528// CHECK-64: cond.true:7529// CHECK-64-NEXT: br label [[COND_END:%.*]]7530// CHECK-64: cond.false:7531// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47532// CHECK-64-NEXT: br label [[COND_END]]7533// CHECK-64: cond.end:7534// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]7535// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 47536// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47537// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 47538// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47539// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47540// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]7541// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7542// CHECK-64: omp.dispatch.body:7543// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7544// CHECK-64: omp.inner.for.cond:7545// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP361:![0-9]+]]7546// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP361]]7547// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]7548// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7549// CHECK-64: omp.inner.for.body:7550// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP361]]7551// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 17552// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7553// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP361]]7554// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7555// CHECK-64: omp.body.continue:7556// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7557// CHECK-64: omp.inner.for.inc:7558// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP361]]7559// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 17560// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP361]]7561// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP362:![0-9]+]]7562// CHECK-64: omp.inner.for.end:7563// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7564// CHECK-64: omp.dispatch.inc:7565// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47566// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 47567// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]7568// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 47569// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47570// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 47571// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]7572// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 47573// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7574// CHECK-64: omp.dispatch.end:7575// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])7576// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 47577// CHECK-64-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 07578// CHECK-64-NEXT: br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]7579// CHECK-64: .omp.final.then:7580// CHECK-64-NEXT: store i32 10, ptr [[I]], align 47581// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]7582// CHECK-64: .omp.final.done:7583// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4:[0-9]+]], i32 [[TMP1]])7584// CHECK-64-NEXT: ret void7585//7586//7587// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1857588// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7589// CHECK-64-NEXT: entry:7590// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87591// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87592// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87593// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l185_kernel_environment, ptr [[DYN_PTR]])7594// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17595// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7596// CHECK-64: user_code.entry:7597// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7598// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l185_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7599// CHECK-64-NEXT: call void @__kmpc_target_deinit()7600// CHECK-64-NEXT: ret void7601// CHECK-64: worker.exit:7602// CHECK-64-NEXT: ret void7603//7604//7605// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l185_omp_outlined7606// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7607// CHECK-64-NEXT: entry:7608// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87609// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87610// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47611// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47612// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47613// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47614// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47615// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47616// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47617// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87618// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87619// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47620// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47621// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47622// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47623// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87624// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47625// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)7626// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47627// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 97628// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]7629// CHECK-64: cond.true:7630// CHECK-64-NEXT: br label [[COND_END:%.*]]7631// CHECK-64: cond.false:7632// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47633// CHECK-64-NEXT: br label [[COND_END]]7634// CHECK-64: cond.end:7635// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]7636// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 47637// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47638// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 47639// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7640// CHECK-64: omp.inner.for.cond:7641// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP364:![0-9]+]]7642// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP364]]7643// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]7644// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7645// CHECK-64: omp.inner.for.body:7646// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP364]]7647// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 17648// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7649// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP364]]7650// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7651// CHECK-64: omp.body.continue:7652// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7653// CHECK-64: omp.inner.for.inc:7654// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP364]]7655// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 17656// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP364]]7657// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP365:![0-9]+]]7658// CHECK-64: omp.inner.for.end:7659// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]7660// CHECK-64: omp.loop.exit:7661// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])7662// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 47663// CHECK-64-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 07664// CHECK-64-NEXT: br i1 [[TMP10]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]7665// CHECK-64: .omp.final.then:7666// CHECK-64-NEXT: store i32 10, ptr [[I]], align 47667// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]7668// CHECK-64: .omp.final.done:7669// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])7670// CHECK-64-NEXT: ret void7671//7672//7673// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1897674// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7675// CHECK-64-NEXT: entry:7676// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87677// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87678// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87679// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l189_kernel_environment, ptr [[DYN_PTR]])7680// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17681// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7682// CHECK-64: user_code.entry:7683// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7684// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l189_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7685// CHECK-64-NEXT: call void @__kmpc_target_deinit()7686// CHECK-64-NEXT: ret void7687// CHECK-64: worker.exit:7688// CHECK-64-NEXT: ret void7689//7690//7691// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l189_omp_outlined7692// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7693// CHECK-64-NEXT: entry:7694// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87695// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87696// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47697// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47698// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47699// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47700// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47701// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47702// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47703// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87704// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87705// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47706// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47707// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47708// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47709// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87710// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47711// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)7712// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7713// CHECK-64: omp.dispatch.cond:7714// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47715// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 97716// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]7717// CHECK-64: cond.true:7718// CHECK-64-NEXT: br label [[COND_END:%.*]]7719// CHECK-64: cond.false:7720// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47721// CHECK-64-NEXT: br label [[COND_END]]7722// CHECK-64: cond.end:7723// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]7724// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 47725// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47726// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 47727// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 47728// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47729// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]7730// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7731// CHECK-64: omp.dispatch.body:7732// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7733// CHECK-64: omp.inner.for.cond:7734// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP367:![0-9]+]]7735// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP367]]7736// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]7737// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7738// CHECK-64: omp.inner.for.body:7739// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP367]]7740// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 17741// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7742// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP367]]7743// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7744// CHECK-64: omp.body.continue:7745// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7746// CHECK-64: omp.inner.for.inc:7747// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP367]]7748// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 17749// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP367]]7750// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP368:![0-9]+]]7751// CHECK-64: omp.inner.for.end:7752// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7753// CHECK-64: omp.dispatch.inc:7754// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47755// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 47756// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]7757// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 47758// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 47759// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 47760// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]7761// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 47762// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7763// CHECK-64: omp.dispatch.end:7764// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])7765// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 47766// CHECK-64-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 07767// CHECK-64-NEXT: br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]7768// CHECK-64: .omp.final.then:7769// CHECK-64-NEXT: store i32 10, ptr [[I]], align 47770// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]7771// CHECK-64: .omp.final.done:7772// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])7773// CHECK-64-NEXT: ret void7774//7775//7776// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1937777// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7778// CHECK-64-NEXT: entry:7779// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87780// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87781// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87782// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l193_kernel_environment, ptr [[DYN_PTR]])7783// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17784// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7785// CHECK-64: user_code.entry:7786// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7787// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l193_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7788// CHECK-64-NEXT: call void @__kmpc_target_deinit()7789// CHECK-64-NEXT: ret void7790// CHECK-64: worker.exit:7791// CHECK-64-NEXT: ret void7792//7793//7794// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l193_omp_outlined7795// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7796// CHECK-64-NEXT: entry:7797// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87798// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87799// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47800// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47801// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47802// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47803// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47804// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47805// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47806// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87807// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87808// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47809// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47810// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47811// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47812// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87813// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47814// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741862, i32 0, i32 9, i32 1, i32 1)7815// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7816// CHECK-64: omp.dispatch.cond:7817// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7818// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07819// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7820// CHECK-64: omp.dispatch.body:7821// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47822// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47823// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7824// CHECK-64: omp.inner.for.cond:7825// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP370:![0-9]+]]7826// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP370]]7827// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7828// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7829// CHECK-64: omp.inner.for.body:7830// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP370]]7831// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17832// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7833// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP370]]7834// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7835// CHECK-64: omp.body.continue:7836// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7837// CHECK-64: omp.inner.for.inc:7838// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP370]]7839// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 17840// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP370]]7841// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP371:![0-9]+]]7842// CHECK-64: omp.inner.for.end:7843// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7844// CHECK-64: omp.dispatch.inc:7845// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7846// CHECK-64: omp.dispatch.end:7847// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])7848// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 47849// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 07850// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]7851// CHECK-64: .omp.final.then:7852// CHECK-64-NEXT: store i32 10, ptr [[I]], align 47853// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]7854// CHECK-64: .omp.final.done:7855// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])7856// CHECK-64-NEXT: ret void7857//7858//7859// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l1977860// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7861// CHECK-64-NEXT: entry:7862// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87863// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87864// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87865// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l197_kernel_environment, ptr [[DYN_PTR]])7866// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17867// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7868// CHECK-64: user_code.entry:7869// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7870// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l197_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7871// CHECK-64-NEXT: call void @__kmpc_target_deinit()7872// CHECK-64-NEXT: ret void7873// CHECK-64: worker.exit:7874// CHECK-64-NEXT: ret void7875//7876//7877// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l197_omp_outlined7878// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7879// CHECK-64-NEXT: entry:7880// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87881// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87882// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47883// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47884// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47885// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47886// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47887// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47888// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47889// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87890// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87891// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47892// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47893// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47894// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47895// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87896// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47897// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741861, i32 0, i32 9, i32 1, i32 1)7898// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7899// CHECK-64: omp.dispatch.cond:7900// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7901// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07902// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7903// CHECK-64: omp.dispatch.body:7904// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47905// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47906// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7907// CHECK-64: omp.inner.for.cond:7908// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP373:![0-9]+]]7909// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP373]]7910// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7911// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7912// CHECK-64: omp.inner.for.body:7913// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP373]]7914// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17915// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7916// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP373]]7917// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]7918// CHECK-64: omp.body.continue:7919// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]7920// CHECK-64: omp.inner.for.inc:7921// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP373]]7922// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 17923// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP373]]7924// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP374:![0-9]+]]7925// CHECK-64: omp.inner.for.end:7926// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]7927// CHECK-64: omp.dispatch.inc:7928// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]7929// CHECK-64: omp.dispatch.end:7930// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])7931// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 47932// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 07933// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]7934// CHECK-64: .omp.final.then:7935// CHECK-64-NEXT: store i32 10, ptr [[I]], align 47936// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]7937// CHECK-64: .omp.final.done:7938// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])7939// CHECK-64-NEXT: ret void7940//7941//7942// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2017943// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {7944// CHECK-64-NEXT: entry:7945// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 87946// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 87947// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 87948// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l201_kernel_environment, ptr [[DYN_PTR]])7949// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -17950// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]7951// CHECK-64: user_code.entry:7952// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])7953// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l201_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)7954// CHECK-64-NEXT: call void @__kmpc_target_deinit()7955// CHECK-64-NEXT: ret void7956// CHECK-64: worker.exit:7957// CHECK-64-NEXT: ret void7958//7959//7960// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l201_omp_outlined7961// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {7962// CHECK-64-NEXT: entry:7963// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 87964// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 87965// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 47966// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 47967// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 47968// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 47969// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 47970// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 47971// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 47972// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 87973// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 87974// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 47975// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 47976// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 47977// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 47978// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 87979// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 47980// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741859, i32 0, i32 9, i32 1, i32 1)7981// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]7982// CHECK-64: omp.dispatch.cond:7983// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])7984// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 07985// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]7986// CHECK-64: omp.dispatch.body:7987// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 47988// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 47989// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]7990// CHECK-64: omp.inner.for.cond:7991// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP376:![0-9]+]]7992// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP376]]7993// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]7994// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]7995// CHECK-64: omp.inner.for.body:7996// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP376]]7997// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 17998// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]7999// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP376]]8000// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8001// CHECK-64: omp.body.continue:8002// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8003// CHECK-64: omp.inner.for.inc:8004// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP376]]8005// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18006// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP376]]8007// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP377:![0-9]+]]8008// CHECK-64: omp.inner.for.end:8009// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8010// CHECK-64: omp.dispatch.inc:8011// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8012// CHECK-64: omp.dispatch.end:8013// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8014// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48015// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08016// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8017// CHECK-64: .omp.final.then:8018// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48019// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8020// CHECK-64: .omp.final.done:8021// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8022// CHECK-64-NEXT: ret void8023//8024//8025// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2058026// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {8027// CHECK-64-NEXT: entry:8028// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88029// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88030// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88031// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l205_kernel_environment, ptr [[DYN_PTR]])8032// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18033// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8034// CHECK-64: user_code.entry:8035// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8036// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l205_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8037// CHECK-64-NEXT: call void @__kmpc_target_deinit()8038// CHECK-64-NEXT: ret void8039// CHECK-64: worker.exit:8040// CHECK-64-NEXT: ret void8041//8042//8043// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l205_omp_outlined8044// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8045// CHECK-64-NEXT: entry:8046// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88047// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88048// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48049// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48050// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48051// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48052// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48053// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48054// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48055// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88056// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88057// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48058// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48059// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48060// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48061// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88062// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48063// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741860, i32 0, i32 9, i32 1, i32 1)8064// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8065// CHECK-64: omp.dispatch.cond:8066// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])8067// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 08068// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8069// CHECK-64: omp.dispatch.body:8070// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48071// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 48072// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8073// CHECK-64: omp.inner.for.cond:8074// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP379:![0-9]+]]8075// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP379]]8076// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]8077// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8078// CHECK-64: omp.inner.for.body:8079// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP379]]8080// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 18081// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8082// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP379]]8083// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8084// CHECK-64: omp.body.continue:8085// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8086// CHECK-64: omp.inner.for.inc:8087// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP379]]8088// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18089// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP379]]8090// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP380:![0-9]+]]8091// CHECK-64: omp.inner.for.end:8092// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8093// CHECK-64: omp.dispatch.inc:8094// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8095// CHECK-64: omp.dispatch.end:8096// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8097// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48098// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08099// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8100// CHECK-64: .omp.final.then:8101// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48102// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8103// CHECK-64: .omp.final.done:8104// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8105// CHECK-64-NEXT: ret void8106//8107//8108// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2098109// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10:[0-9]+]] {8110// CHECK-64-NEXT: entry:8111// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88112// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88113// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88114// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l209_kernel_environment, ptr [[DYN_PTR]])8115// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18116// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8117// CHECK-64: user_code.entry:8118// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8119// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l209_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8120// CHECK-64-NEXT: call void @__kmpc_target_deinit()8121// CHECK-64-NEXT: ret void8122// CHECK-64: worker.exit:8123// CHECK-64-NEXT: ret void8124//8125//8126// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l209_omp_outlined8127// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8128// CHECK-64-NEXT: entry:8129// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88130// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88131// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48132// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48133// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48134// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48135// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48136// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48137// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48138// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88139// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88140// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48141// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48142// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48143// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48144// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88145// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48146// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 65, i32 0, i32 9, i32 1, i32 1)8147// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8148// CHECK-64: omp.dispatch.cond:8149// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])8150// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 08151// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8152// CHECK-64: omp.dispatch.body:8153// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48154// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 48155// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8156// CHECK-64: omp.inner.for.cond:8157// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP382:![0-9]+]]8158// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP382]]8159// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]8160// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8161// CHECK-64: omp.inner.for.body:8162// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP382]]8163// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 18164// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8165// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP382]]8166// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8167// CHECK-64: omp.body.continue:8168// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8169// CHECK-64: omp.inner.for.inc:8170// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP382]]8171// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18172// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP382]]8173// CHECK-64-NEXT: call void @__kmpc_dispatch_fini_4(ptr @[[GLOB1]], i32 [[TMP1]]), !llvm.access.group [[ACC_GRP382]]8174// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP383:![0-9]+]]8175// CHECK-64: omp.inner.for.end:8176// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8177// CHECK-64: omp.dispatch.inc:8178// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8179// CHECK-64: omp.dispatch.end:8180// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8181// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48182// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08183// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8184// CHECK-64: .omp.final.then:8185// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48186// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8187// CHECK-64: .omp.final.done:8188// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8189// CHECK-64-NEXT: ret void8190//8191//8192// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2148193// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10]] {8194// CHECK-64-NEXT: entry:8195// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88196// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88197// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88198// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l214_kernel_environment, ptr [[DYN_PTR]])8199// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18200// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8201// CHECK-64: user_code.entry:8202// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8203// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l214_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8204// CHECK-64-NEXT: call void @__kmpc_target_deinit()8205// CHECK-64-NEXT: ret void8206// CHECK-64: worker.exit:8207// CHECK-64-NEXT: ret void8208//8209//8210// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l214_omp_outlined8211// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8212// CHECK-64-NEXT: entry:8213// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88214// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88215// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48216// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48217// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48218// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48219// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48220// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48221// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48222// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88223// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88224// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48225// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48226// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48227// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48228// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88229// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48230// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)8231// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48232// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 98233// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]8234// CHECK-64: cond.true:8235// CHECK-64-NEXT: br label [[COND_END:%.*]]8236// CHECK-64: cond.false:8237// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48238// CHECK-64-NEXT: br label [[COND_END]]8239// CHECK-64: cond.end:8240// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]8241// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 48242// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48243// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 48244// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8245// CHECK-64: omp.inner.for.cond:8246// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP385:![0-9]+]]8247// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP385]]8248// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]8249// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8250// CHECK-64: omp.inner.for.body:8251// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP385]]8252// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 18253// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8254// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP385]]8255// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8256// CHECK-64: omp.body.continue:8257// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8258// CHECK-64: omp.inner.for.inc:8259// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP385]]8260// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 18261// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP385]]8262// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP386:![0-9]+]]8263// CHECK-64: omp.inner.for.end:8264// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]8265// CHECK-64: omp.loop.exit:8266// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])8267// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48268// CHECK-64-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 08269// CHECK-64-NEXT: br i1 [[TMP10]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8270// CHECK-64: .omp.final.then:8271// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48272// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8273// CHECK-64: .omp.final.done:8274// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8275// CHECK-64-NEXT: ret void8276//8277//8278// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2198279// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10]] {8280// CHECK-64-NEXT: entry:8281// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88282// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88283// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88284// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l219_kernel_environment, ptr [[DYN_PTR]])8285// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18286// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8287// CHECK-64: user_code.entry:8288// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8289// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l219_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8290// CHECK-64-NEXT: call void @__kmpc_target_deinit()8291// CHECK-64-NEXT: ret void8292// CHECK-64: worker.exit:8293// CHECK-64-NEXT: ret void8294//8295//8296// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l219_omp_outlined8297// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8298// CHECK-64-NEXT: entry:8299// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88300// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88301// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48302// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48303// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48304// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48305// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48306// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48307// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48308// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88309// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88310// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48311// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48312// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48313// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48314// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88315// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48316// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)8317// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8318// CHECK-64: omp.dispatch.cond:8319// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48320// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 98321// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]8322// CHECK-64: cond.true:8323// CHECK-64-NEXT: br label [[COND_END:%.*]]8324// CHECK-64: cond.false:8325// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48326// CHECK-64-NEXT: br label [[COND_END]]8327// CHECK-64: cond.end:8328// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]8329// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 48330// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48331// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 48332// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48333// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48334// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]8335// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8336// CHECK-64: omp.dispatch.body:8337// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8338// CHECK-64: omp.inner.for.cond:8339// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP388:![0-9]+]]8340// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP388]]8341// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]8342// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8343// CHECK-64: omp.inner.for.body:8344// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP388]]8345// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 18346// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8347// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP388]]8348// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8349// CHECK-64: omp.body.continue:8350// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8351// CHECK-64: omp.inner.for.inc:8352// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP388]]8353// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 18354// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP388]]8355// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP389:![0-9]+]]8356// CHECK-64: omp.inner.for.end:8357// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8358// CHECK-64: omp.dispatch.inc:8359// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48360// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 48361// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]8362// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 48363// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48364// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 48365// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]8366// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 48367// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8368// CHECK-64: omp.dispatch.end:8369// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])8370// CHECK-64-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48371// CHECK-64-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 08372// CHECK-64-NEXT: br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8373// CHECK-64: .omp.final.then:8374// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48375// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8376// CHECK-64: .omp.final.done:8377// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8378// CHECK-64-NEXT: ret void8379//8380//8381// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2248382// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10]] {8383// CHECK-64-NEXT: entry:8384// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88385// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88386// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88387// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l224_kernel_environment, ptr [[DYN_PTR]])8388// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18389// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8390// CHECK-64: user_code.entry:8391// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8392// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l224_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8393// CHECK-64-NEXT: call void @__kmpc_target_deinit()8394// CHECK-64-NEXT: ret void8395// CHECK-64: worker.exit:8396// CHECK-64-NEXT: ret void8397//8398//8399// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l224_omp_outlined8400// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8401// CHECK-64-NEXT: entry:8402// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88403// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88404// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48405// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48406// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48407// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48408// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48409// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48410// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48411// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88412// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88413// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48414// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48415// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48416// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48417// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88418// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48419// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741862, i32 0, i32 9, i32 1, i32 1)8420// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8421// CHECK-64: omp.dispatch.cond:8422// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])8423// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 08424// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8425// CHECK-64: omp.dispatch.body:8426// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48427// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 48428// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8429// CHECK-64: omp.inner.for.cond:8430// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP391:![0-9]+]]8431// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP391]]8432// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]8433// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8434// CHECK-64: omp.inner.for.body:8435// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP391]]8436// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 18437// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8438// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP391]]8439// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8440// CHECK-64: omp.body.continue:8441// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8442// CHECK-64: omp.inner.for.inc:8443// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP391]]8444// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18445// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP391]]8446// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP392:![0-9]+]]8447// CHECK-64: omp.inner.for.end:8448// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8449// CHECK-64: omp.dispatch.inc:8450// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8451// CHECK-64: omp.dispatch.end:8452// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8453// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48454// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08455// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8456// CHECK-64: .omp.final.then:8457// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48458// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8459// CHECK-64: .omp.final.done:8460// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8461// CHECK-64-NEXT: ret void8462//8463//8464// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2298465// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10]] {8466// CHECK-64-NEXT: entry:8467// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88468// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88469// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88470// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l229_kernel_environment, ptr [[DYN_PTR]])8471// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18472// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8473// CHECK-64: user_code.entry:8474// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8475// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l229_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8476// CHECK-64-NEXT: call void @__kmpc_target_deinit()8477// CHECK-64-NEXT: ret void8478// CHECK-64: worker.exit:8479// CHECK-64-NEXT: ret void8480//8481//8482// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l229_omp_outlined8483// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8484// CHECK-64-NEXT: entry:8485// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88486// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88487// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48488// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48489// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48490// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48491// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48492// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48493// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48494// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88495// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88496// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48497// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48498// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48499// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48500// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88501// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48502// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741861, i32 0, i32 9, i32 1, i32 1)8503// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8504// CHECK-64: omp.dispatch.cond:8505// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])8506// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 08507// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8508// CHECK-64: omp.dispatch.body:8509// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48510// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 48511// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8512// CHECK-64: omp.inner.for.cond:8513// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP394:![0-9]+]]8514// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP394]]8515// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]8516// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8517// CHECK-64: omp.inner.for.body:8518// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP394]]8519// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 18520// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8521// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP394]]8522// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8523// CHECK-64: omp.body.continue:8524// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8525// CHECK-64: omp.inner.for.inc:8526// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP394]]8527// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18528// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP394]]8529// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP395:![0-9]+]]8530// CHECK-64: omp.inner.for.end:8531// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8532// CHECK-64: omp.dispatch.inc:8533// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8534// CHECK-64: omp.dispatch.end:8535// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8536// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48537// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08538// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8539// CHECK-64: .omp.final.then:8540// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48541// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8542// CHECK-64: .omp.final.done:8543// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8544// CHECK-64-NEXT: ret void8545//8546//8547// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2348548// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10]] {8549// CHECK-64-NEXT: entry:8550// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88551// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88552// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88553// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l234_kernel_environment, ptr [[DYN_PTR]])8554// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18555// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8556// CHECK-64: user_code.entry:8557// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8558// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l234_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8559// CHECK-64-NEXT: call void @__kmpc_target_deinit()8560// CHECK-64-NEXT: ret void8561// CHECK-64: worker.exit:8562// CHECK-64-NEXT: ret void8563//8564//8565// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l234_omp_outlined8566// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8567// CHECK-64-NEXT: entry:8568// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88569// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88570// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48571// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48572// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48573// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48574// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48575// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48576// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48577// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88578// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88579// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48580// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48581// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48582// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48583// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88584// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48585// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741859, i32 0, i32 9, i32 1, i32 1)8586// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8587// CHECK-64: omp.dispatch.cond:8588// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])8589// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 08590// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8591// CHECK-64: omp.dispatch.body:8592// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48593// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 48594// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8595// CHECK-64: omp.inner.for.cond:8596// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP397:![0-9]+]]8597// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP397]]8598// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]8599// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8600// CHECK-64: omp.inner.for.body:8601// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP397]]8602// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 18603// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8604// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP397]]8605// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8606// CHECK-64: omp.body.continue:8607// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8608// CHECK-64: omp.inner.for.inc:8609// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP397]]8610// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18611// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP397]]8612// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP398:![0-9]+]]8613// CHECK-64: omp.inner.for.end:8614// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8615// CHECK-64: omp.dispatch.inc:8616// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8617// CHECK-64: omp.dispatch.end:8618// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8619// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48620// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08621// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8622// CHECK-64: .omp.final.then:8623// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48624// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8625// CHECK-64: .omp.final.done:8626// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8627// CHECK-64-NEXT: ret void8628//8629//8630// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2398631// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR10]] {8632// CHECK-64-NEXT: entry:8633// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88634// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88635// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88636// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l239_kernel_environment, ptr [[DYN_PTR]])8637// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18638// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8639// CHECK-64: user_code.entry:8640// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8641// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l239_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8642// CHECK-64-NEXT: call void @__kmpc_target_deinit()8643// CHECK-64-NEXT: ret void8644// CHECK-64: worker.exit:8645// CHECK-64-NEXT: ret void8646//8647//8648// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l239_omp_outlined8649// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8650// CHECK-64-NEXT: entry:8651// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88652// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88653// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48654// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48655// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48656// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48657// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48658// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48659// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48660// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88661// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88662// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48663// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48664// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48665// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48666// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88667// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48668// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741860, i32 0, i32 9, i32 1, i32 1)8669// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8670// CHECK-64: omp.dispatch.cond:8671// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])8672// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 08673// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8674// CHECK-64: omp.dispatch.body:8675// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48676// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 48677// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8678// CHECK-64: omp.inner.for.cond:8679// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP400:![0-9]+]]8680// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP400]]8681// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]8682// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8683// CHECK-64: omp.inner.for.body:8684// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP400]]8685// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 18686// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8687// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP400]]8688// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8689// CHECK-64: omp.body.continue:8690// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8691// CHECK-64: omp.inner.for.inc:8692// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP400]]8693// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 18694// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP400]]8695// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP401:![0-9]+]]8696// CHECK-64: omp.inner.for.end:8697// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8698// CHECK-64: omp.dispatch.inc:8699// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8700// CHECK-64: omp.dispatch.end:8701// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])8702// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 48703// CHECK-64-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 08704// CHECK-64-NEXT: br i1 [[TMP9]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]8705// CHECK-64: .omp.final.then:8706// CHECK-64-NEXT: store i32 10, ptr [[I]], align 48707// CHECK-64-NEXT: br label [[DOTOMP_FINAL_DONE]]8708// CHECK-64: .omp.final.done:8709// CHECK-64-NEXT: call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP1]])8710// CHECK-64-NEXT: ret void8711//8712//8713// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2448714// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {8715// CHECK-64-NEXT: entry:8716// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88717// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88718// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88719// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l244_kernel_environment, ptr [[DYN_PTR]])8720// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18721// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8722// CHECK-64: user_code.entry:8723// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8724// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l244_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8725// CHECK-64-NEXT: call void @__kmpc_target_deinit()8726// CHECK-64-NEXT: ret void8727// CHECK-64: worker.exit:8728// CHECK-64-NEXT: ret void8729//8730//8731// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l244_omp_outlined8732// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8733// CHECK-64-NEXT: entry:8734// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88735// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88736// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48737// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48738// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48739// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48740// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48741// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48742// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48743// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88744// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88745// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48746// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48747// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48748// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48749// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88750// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48751// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)8752// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8753// CHECK-64: omp.dispatch.cond:8754// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48755// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 98756// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]8757// CHECK-64: cond.true:8758// CHECK-64-NEXT: br label [[COND_END:%.*]]8759// CHECK-64: cond.false:8760// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48761// CHECK-64-NEXT: br label [[COND_END]]8762// CHECK-64: cond.end:8763// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]8764// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 48765// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48766// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 48767// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48768// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48769// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]8770// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8771// CHECK-64: omp.dispatch.body:8772// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8773// CHECK-64: omp.inner.for.cond:8774// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48775// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48776// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]8777// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8778// CHECK-64: omp.inner.for.body:8779// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48780// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 18781// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8782// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 48783// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8784// CHECK-64: omp.body.continue:8785// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8786// CHECK-64: omp.inner.for.inc:8787// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48788// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 18789// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 48790// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]8791// CHECK-64: omp.inner.for.end:8792// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8793// CHECK-64: omp.dispatch.inc:8794// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48795// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 48796// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]8797// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 48798// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48799// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 48800// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]8801// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 48802// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8803// CHECK-64: omp.dispatch.end:8804// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])8805// CHECK-64-NEXT: ret void8806//8807//8808// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2488809// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {8810// CHECK-64-NEXT: entry:8811// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88812// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88813// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88814// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l248_kernel_environment, ptr [[DYN_PTR]])8815// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18816// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8817// CHECK-64: user_code.entry:8818// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8819// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l248_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8820// CHECK-64-NEXT: call void @__kmpc_target_deinit()8821// CHECK-64-NEXT: ret void8822// CHECK-64: worker.exit:8823// CHECK-64-NEXT: ret void8824//8825//8826// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l248_omp_outlined8827// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8828// CHECK-64-NEXT: entry:8829// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88830// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88831// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48832// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48833// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48834// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48835// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48836// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48837// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48838// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88839// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88840// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48841// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48842// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48843// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48844// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88845// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48846// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)8847// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48848// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 98849// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]8850// CHECK-64: cond.true:8851// CHECK-64-NEXT: br label [[COND_END:%.*]]8852// CHECK-64: cond.false:8853// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48854// CHECK-64-NEXT: br label [[COND_END]]8855// CHECK-64: cond.end:8856// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]8857// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 48858// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48859// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 48860// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8861// CHECK-64: omp.inner.for.cond:8862// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48863// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48864// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]8865// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8866// CHECK-64: omp.inner.for.body:8867// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48868// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 18869// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8870// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 48871// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8872// CHECK-64: omp.body.continue:8873// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8874// CHECK-64: omp.inner.for.inc:8875// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48876// CHECK-64-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 18877// CHECK-64-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 48878// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]8879// CHECK-64: omp.inner.for.end:8880// CHECK-64-NEXT: br label [[OMP_LOOP_EXIT:%.*]]8881// CHECK-64: omp.loop.exit:8882// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])8883// CHECK-64-NEXT: ret void8884//8885//8886// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2528887// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {8888// CHECK-64-NEXT: entry:8889// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88890// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88891// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88892// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l252_kernel_environment, ptr [[DYN_PTR]])8893// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18894// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8895// CHECK-64: user_code.entry:8896// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8897// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l252_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8898// CHECK-64-NEXT: call void @__kmpc_target_deinit()8899// CHECK-64-NEXT: ret void8900// CHECK-64: worker.exit:8901// CHECK-64-NEXT: ret void8902//8903//8904// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l252_omp_outlined8905// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {8906// CHECK-64-NEXT: entry:8907// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 88908// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 88909// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 48910// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 48911// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 48912// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 48913// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 48914// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 48915// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 48916// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 88917// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 88918// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 48919// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 48920// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 48921// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 48922// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 88923// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 48924// CHECK-64-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP1]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)8925// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]8926// CHECK-64: omp.dispatch.cond:8927// CHECK-64-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48928// CHECK-64-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 98929// CHECK-64-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]8930// CHECK-64: cond.true:8931// CHECK-64-NEXT: br label [[COND_END:%.*]]8932// CHECK-64: cond.false:8933// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48934// CHECK-64-NEXT: br label [[COND_END]]8935// CHECK-64: cond.end:8936// CHECK-64-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]8937// CHECK-64-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 48938// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48939// CHECK-64-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 48940// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48941// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48942// CHECK-64-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]8943// CHECK-64-NEXT: br i1 [[CMP1]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]8944// CHECK-64: omp.dispatch.body:8945// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]8946// CHECK-64: omp.inner.for.cond:8947// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48948// CHECK-64-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48949// CHECK-64-NEXT: [[CMP2:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]8950// CHECK-64-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]8951// CHECK-64: omp.inner.for.body:8952// CHECK-64-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48953// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 18954// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]8955// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 48956// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]8957// CHECK-64: omp.body.continue:8958// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]8959// CHECK-64: omp.inner.for.inc:8960// CHECK-64-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 48961// CHECK-64-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP10]], 18962// CHECK-64-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 48963// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]]8964// CHECK-64: omp.inner.for.end:8965// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]8966// CHECK-64: omp.dispatch.inc:8967// CHECK-64-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_LB]], align 48968// CHECK-64-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 48969// CHECK-64-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]8970// CHECK-64-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_LB]], align 48971// CHECK-64-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_UB]], align 48972// CHECK-64-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 48973// CHECK-64-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]8974// CHECK-64-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_UB]], align 48975// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]8976// CHECK-64: omp.dispatch.end:8977// CHECK-64-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP1]])8978// CHECK-64-NEXT: ret void8979//8980//8981// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2568982// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {8983// CHECK-64-NEXT: entry:8984// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 88985// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 88986// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 88987// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l256_kernel_environment, ptr [[DYN_PTR]])8988// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -18989// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]8990// CHECK-64: user_code.entry:8991// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])8992// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l256_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)8993// CHECK-64-NEXT: call void @__kmpc_target_deinit()8994// CHECK-64-NEXT: ret void8995// CHECK-64: worker.exit:8996// CHECK-64-NEXT: ret void8997//8998//8999// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l256_omp_outlined9000// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {9001// CHECK-64-NEXT: entry:9002// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 89003// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 89004// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49005// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 49006// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49007// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49008// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49009// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49010// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 49011// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 89012// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 89013// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49014// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49015// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49016// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49017// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 89018// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49019// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741862, i32 0, i32 9, i32 1, i32 1)9020// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]9021// CHECK-64: omp.dispatch.cond:9022// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])9023// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 09024// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]9025// CHECK-64: omp.dispatch.body:9026// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49027// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 49028// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9029// CHECK-64: omp.inner.for.cond:9030// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP403:![0-9]+]]9031// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP403]]9032// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]9033// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9034// CHECK-64: omp.inner.for.body:9035// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP403]]9036// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 19037// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9038// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP403]]9039// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9040// CHECK-64: omp.body.continue:9041// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9042// CHECK-64: omp.inner.for.inc:9043// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP403]]9044// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 19045// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP403]]9046// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP404:![0-9]+]]9047// CHECK-64: omp.inner.for.end:9048// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]9049// CHECK-64: omp.dispatch.inc:9050// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]9051// CHECK-64: omp.dispatch.end:9052// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])9053// CHECK-64-NEXT: ret void9054//9055//9056// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2609057// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {9058// CHECK-64-NEXT: entry:9059// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 89060// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 89061// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 89062// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l260_kernel_environment, ptr [[DYN_PTR]])9063// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -19064// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]9065// CHECK-64: user_code.entry:9066// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])9067// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l260_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)9068// CHECK-64-NEXT: call void @__kmpc_target_deinit()9069// CHECK-64-NEXT: ret void9070// CHECK-64: worker.exit:9071// CHECK-64-NEXT: ret void9072//9073//9074// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l260_omp_outlined9075// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {9076// CHECK-64-NEXT: entry:9077// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 89078// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 89079// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49080// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 49081// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49082// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49083// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49084// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49085// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 49086// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 89087// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 89088// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49089// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49090// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49091// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49092// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 89093// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49094// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741861, i32 0, i32 9, i32 1, i32 1)9095// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]9096// CHECK-64: omp.dispatch.cond:9097// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])9098// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 09099// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]9100// CHECK-64: omp.dispatch.body:9101// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49102// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 49103// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9104// CHECK-64: omp.inner.for.cond:9105// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP406:![0-9]+]]9106// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP406]]9107// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]9108// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9109// CHECK-64: omp.inner.for.body:9110// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP406]]9111// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 19112// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9113// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP406]]9114// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9115// CHECK-64: omp.body.continue:9116// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9117// CHECK-64: omp.inner.for.inc:9118// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP406]]9119// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 19120// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP406]]9121// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP407:![0-9]+]]9122// CHECK-64: omp.inner.for.end:9123// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]9124// CHECK-64: omp.dispatch.inc:9125// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]9126// CHECK-64: omp.dispatch.end:9127// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])9128// CHECK-64-NEXT: ret void9129//9130//9131// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2649132// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {9133// CHECK-64-NEXT: entry:9134// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 89135// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 89136// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 89137// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l264_kernel_environment, ptr [[DYN_PTR]])9138// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -19139// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]9140// CHECK-64: user_code.entry:9141// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])9142// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l264_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)9143// CHECK-64-NEXT: call void @__kmpc_target_deinit()9144// CHECK-64-NEXT: ret void9145// CHECK-64: worker.exit:9146// CHECK-64-NEXT: ret void9147//9148//9149// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l264_omp_outlined9150// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {9151// CHECK-64-NEXT: entry:9152// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 89153// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 89154// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49155// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 49156// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49157// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49158// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49159// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49160// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 49161// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 89162// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 89163// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49164// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49165// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49166// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49167// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 89168// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49169// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741859, i32 0, i32 9, i32 1, i32 1)9170// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]9171// CHECK-64: omp.dispatch.cond:9172// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])9173// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 09174// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]9175// CHECK-64: omp.dispatch.body:9176// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49177// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 49178// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9179// CHECK-64: omp.inner.for.cond:9180// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP409:![0-9]+]]9181// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP409]]9182// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]9183// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9184// CHECK-64: omp.inner.for.body:9185// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP409]]9186// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 19187// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9188// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP409]]9189// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9190// CHECK-64: omp.body.continue:9191// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9192// CHECK-64: omp.inner.for.inc:9193// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP409]]9194// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 19195// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP409]]9196// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP410:![0-9]+]]9197// CHECK-64: omp.inner.for.end:9198// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]9199// CHECK-64: omp.dispatch.inc:9200// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]9201// CHECK-64: omp.dispatch.end:9202// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])9203// CHECK-64-NEXT: ret void9204//9205//9206// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2689207// CHECK-64-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR8]] {9208// CHECK-64-NEXT: entry:9209// CHECK-64-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 89210// CHECK-64-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [0 x ptr], align 89211// CHECK-64-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 89212// CHECK-64-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l268_kernel_environment, ptr [[DYN_PTR]])9213// CHECK-64-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -19214// CHECK-64-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]9215// CHECK-64: user_code.entry:9216// CHECK-64-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])9217// CHECK-64-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l268_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 0)9218// CHECK-64-NEXT: call void @__kmpc_target_deinit()9219// CHECK-64-NEXT: ret void9220// CHECK-64: worker.exit:9221// CHECK-64-NEXT: ret void9222//9223//9224// CHECK-64-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l268_omp_outlined9225// CHECK-64-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {9226// CHECK-64-NEXT: entry:9227// CHECK-64-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 89228// CHECK-64-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 89229// CHECK-64-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49230// CHECK-64-NEXT: [[TMP:%.*]] = alloca i32, align 49231// CHECK-64-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49232// CHECK-64-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49233// CHECK-64-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49234// CHECK-64-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49235// CHECK-64-NEXT: [[I:%.*]] = alloca i32, align 49236// CHECK-64-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 89237// CHECK-64-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 89238// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49239// CHECK-64-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49240// CHECK-64-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49241// CHECK-64-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49242// CHECK-64-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 89243// CHECK-64-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49244// CHECK-64-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 1073741860, i32 0, i32 9, i32 1, i32 1)9245// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND:%.*]]9246// CHECK-64: omp.dispatch.cond:9247// CHECK-64-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP1]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])9248// CHECK-64-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 09249// CHECK-64-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]9250// CHECK-64: omp.dispatch.body:9251// CHECK-64-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49252// CHECK-64-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 49253// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9254// CHECK-64: omp.inner.for.cond:9255// CHECK-64-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP412:![0-9]+]]9256// CHECK-64-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP412]]9257// CHECK-64-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]9258// CHECK-64-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9259// CHECK-64: omp.inner.for.body:9260// CHECK-64-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP412]]9261// CHECK-64-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 19262// CHECK-64-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9263// CHECK-64-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP412]]9264// CHECK-64-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9265// CHECK-64: omp.body.continue:9266// CHECK-64-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9267// CHECK-64: omp.inner.for.inc:9268// CHECK-64-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP412]]9269// CHECK-64-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP7]], 19270// CHECK-64-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP412]]9271// CHECK-64-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP413:![0-9]+]]9272// CHECK-64: omp.inner.for.end:9273// CHECK-64-NEXT: br label [[OMP_DISPATCH_INC:%.*]]9274// CHECK-64: omp.dispatch.inc:9275// CHECK-64-NEXT: br label [[OMP_DISPATCH_COND]]9276// CHECK-64: omp.dispatch.end:9277// CHECK-64-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP1]])9278// CHECK-64-NEXT: ret void9279//9280//9281// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l159282// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR0:[0-9]+]] {9283// CHECK-32-NEXT: entry:9284// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 49285// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 49286// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 49287// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 49288// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 49289// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 49290// CHECK-32-NEXT: store i32 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 49291// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_kernel_environment, ptr [[DYN_PTR]])9292// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -19293// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]9294// CHECK-32: user_code.entry:9295// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])9296// CHECK-32-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 19297// CHECK-32-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i19298// CHECK-32-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TOBOOL]] to i89299// CHECK-32-NEXT: store i8 [[FROMBOOL]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 19300// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__CASTED]], align 49301// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 49302// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 49303// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], i32 [[TMP3]]) #[[ATTR2:[0-9]+]]9304// CHECK-32-NEXT: call void @__kmpc_target_deinit()9305// CHECK-32-NEXT: ret void9306// CHECK-32: worker.exit:9307// CHECK-32-NEXT: ret void9308//9309//9310// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined9311// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1:[0-9]+]] {9312// CHECK-32-NEXT: entry:9313// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49314// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49315// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 49316// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49317// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 49318// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 49319// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 49320// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49321// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49322// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 49323// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 49324// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x ptr], align 49325// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__CASTED15:%.*]] = alloca i32, align 49326// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS17:%.*]] = alloca [3 x ptr], align 49327// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 49328// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 49329// CHECK-32-NEXT: store i32 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 49330// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 49331// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 49332// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49333// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49334// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()9335// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49336// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49337// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2:[0-9]+]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])9338// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49339// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 99340// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]9341// CHECK-32: cond.true:9342// CHECK-32-NEXT: br label [[COND_END:%.*]]9343// CHECK-32: cond.false:9344// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49345// CHECK-32-NEXT: br label [[COND_END]]9346// CHECK-32: cond.end:9347// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]9348// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 49349// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 49350// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 49351// CHECK-32-NEXT: [[TMP5:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 19352// CHECK-32-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP5]] to i19353// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]9354// CHECK-32: omp_if.then:9355// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9356// CHECK-32: omp.inner.for.cond:9357// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221:![0-9]+]]9358// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP6]], 109359// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9360// CHECK-32: omp.inner.for.body:9361// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]9362// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]9363// CHECK-32-NEXT: [[TMP9:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1, !llvm.access.group [[ACC_GRP221]]9364// CHECK-32-NEXT: [[TOBOOL2:%.*]] = trunc i8 [[TMP9]] to i19365// CHECK-32-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TOBOOL2]] to i89366// CHECK-32-NEXT: store i8 [[FROMBOOL]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 1, !llvm.access.group [[ACC_GRP221]]9367// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__CASTED]], align 4, !llvm.access.group [[ACC_GRP221]]9368// CHECK-32-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 09369// CHECK-32-NEXT: [[TMP12:%.*]] = inttoptr i32 [[TMP7]] to ptr9370// CHECK-32-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 4, !llvm.access.group [[ACC_GRP221]]9371// CHECK-32-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 19372// CHECK-32-NEXT: [[TMP14:%.*]] = inttoptr i32 [[TMP8]] to ptr9373// CHECK-32-NEXT: store ptr [[TMP14]], ptr [[TMP13]], align 4, !llvm.access.group [[ACC_GRP221]]9374// CHECK-32-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 29375// CHECK-32-NEXT: [[TMP16:%.*]] = inttoptr i32 [[TMP10]] to ptr9376// CHECK-32-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 4, !llvm.access.group [[ACC_GRP221]]9377// CHECK-32-NEXT: [[TMP17:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 1, !llvm.access.group [[ACC_GRP221]]9378// CHECK-32-NEXT: [[TOBOOL3:%.*]] = trunc i8 [[TMP17]] to i19379// CHECK-32-NEXT: [[TMP18:%.*]] = zext i1 [[TOBOOL3]] to i329380// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 [[TMP18]], i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 3), !llvm.access.group [[ACC_GRP221]]9381// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9382// CHECK-32: omp.inner.for.inc:9383// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221]]9384// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP221]]9385// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP19]], [[TMP20]]9386// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221]]9387// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]9388// CHECK-32-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP221]]9389// CHECK-32-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]9390// CHECK-32-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]9391// CHECK-32-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]9392// CHECK-32-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP221]]9393// CHECK-32-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]9394// CHECK-32-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]9395// CHECK-32-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]9396// CHECK-32-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP25]], 99397// CHECK-32-NEXT: br i1 [[CMP6]], label [[COND_TRUE7:%.*]], label [[COND_FALSE8:%.*]]9398// CHECK-32: cond.true7:9399// CHECK-32-NEXT: br label [[COND_END9:%.*]]9400// CHECK-32: cond.false8:9401// CHECK-32-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]9402// CHECK-32-NEXT: br label [[COND_END9]]9403// CHECK-32: cond.end9:9404// CHECK-32-NEXT: [[COND10:%.*]] = phi i32 [ 9, [[COND_TRUE7]] ], [ [[TMP26]], [[COND_FALSE8]] ]9405// CHECK-32-NEXT: store i32 [[COND10]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP221]]9406// CHECK-32-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP221]]9407// CHECK-32-NEXT: store i32 [[TMP27]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP221]]9408// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP222:![0-9]+]]9409// CHECK-32: omp.inner.for.end:9410// CHECK-32-NEXT: br label [[OMP_IF_END:%.*]]9411// CHECK-32: omp_if.else:9412// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND11:%.*]]9413// CHECK-32: omp.inner.for.cond11:9414// CHECK-32-NEXT: [[TMP28:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49415// CHECK-32-NEXT: [[CMP12:%.*]] = icmp slt i32 [[TMP28]], 109416// CHECK-32-NEXT: br i1 [[CMP12]], label [[OMP_INNER_FOR_BODY13:%.*]], label [[OMP_INNER_FOR_END28:%.*]]9417// CHECK-32: omp.inner.for.body13:9418// CHECK-32-NEXT: [[TMP29:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 49419// CHECK-32-NEXT: [[TMP30:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49420// CHECK-32-NEXT: [[TMP31:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 19421// CHECK-32-NEXT: [[TOBOOL14:%.*]] = trunc i8 [[TMP31]] to i19422// CHECK-32-NEXT: [[FROMBOOL16:%.*]] = zext i1 [[TOBOOL14]] to i89423// CHECK-32-NEXT: store i8 [[FROMBOOL16]], ptr [[DOTCAPTURE_EXPR__CASTED15]], align 19424// CHECK-32-NEXT: [[TMP32:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__CASTED15]], align 49425// CHECK-32-NEXT: [[TMP33:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS17]], i32 0, i32 09426// CHECK-32-NEXT: [[TMP34:%.*]] = inttoptr i32 [[TMP29]] to ptr9427// CHECK-32-NEXT: store ptr [[TMP34]], ptr [[TMP33]], align 49428// CHECK-32-NEXT: [[TMP35:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS17]], i32 0, i32 19429// CHECK-32-NEXT: [[TMP36:%.*]] = inttoptr i32 [[TMP30]] to ptr9430// CHECK-32-NEXT: store ptr [[TMP36]], ptr [[TMP35]], align 49431// CHECK-32-NEXT: [[TMP37:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS17]], i32 0, i32 29432// CHECK-32-NEXT: [[TMP38:%.*]] = inttoptr i32 [[TMP32]] to ptr9433// CHECK-32-NEXT: store ptr [[TMP38]], ptr [[TMP37]], align 49434// CHECK-32-NEXT: [[TMP39:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 19435// CHECK-32-NEXT: [[TOBOOL18:%.*]] = trunc i8 [[TMP39]] to i19436// CHECK-32-NEXT: [[TMP40:%.*]] = zext i1 [[TOBOOL18]] to i329437// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 [[TMP40]], i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined1, ptr null, ptr [[CAPTURED_VARS_ADDRS17]], i32 3)9438// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC19:%.*]]9439// CHECK-32: omp.inner.for.inc19:9440// CHECK-32-NEXT: [[TMP41:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49441// CHECK-32-NEXT: [[TMP42:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 49442// CHECK-32-NEXT: [[ADD20:%.*]] = add nsw i32 [[TMP41]], [[TMP42]]9443// CHECK-32-NEXT: store i32 [[ADD20]], ptr [[DOTOMP_IV]], align 49444// CHECK-32-NEXT: [[TMP43:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 49445// CHECK-32-NEXT: [[TMP44:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 49446// CHECK-32-NEXT: [[ADD21:%.*]] = add nsw i32 [[TMP43]], [[TMP44]]9447// CHECK-32-NEXT: store i32 [[ADD21]], ptr [[DOTOMP_COMB_LB]], align 49448// CHECK-32-NEXT: [[TMP45:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49449// CHECK-32-NEXT: [[TMP46:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 49450// CHECK-32-NEXT: [[ADD22:%.*]] = add nsw i32 [[TMP45]], [[TMP46]]9451// CHECK-32-NEXT: store i32 [[ADD22]], ptr [[DOTOMP_COMB_UB]], align 49452// CHECK-32-NEXT: [[TMP47:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49453// CHECK-32-NEXT: [[CMP23:%.*]] = icmp sgt i32 [[TMP47]], 99454// CHECK-32-NEXT: br i1 [[CMP23]], label [[COND_TRUE24:%.*]], label [[COND_FALSE25:%.*]]9455// CHECK-32: cond.true24:9456// CHECK-32-NEXT: br label [[COND_END26:%.*]]9457// CHECK-32: cond.false25:9458// CHECK-32-NEXT: [[TMP48:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49459// CHECK-32-NEXT: br label [[COND_END26]]9460// CHECK-32: cond.end26:9461// CHECK-32-NEXT: [[COND27:%.*]] = phi i32 [ 9, [[COND_TRUE24]] ], [ [[TMP48]], [[COND_FALSE25]] ]9462// CHECK-32-NEXT: store i32 [[COND27]], ptr [[DOTOMP_COMB_UB]], align 49463// CHECK-32-NEXT: [[TMP49:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 49464// CHECK-32-NEXT: store i32 [[TMP49]], ptr [[DOTOMP_IV]], align 49465// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND11]], !llvm.loop [[LOOP225:![0-9]+]]9466// CHECK-32: omp.inner.for.end28:9467// CHECK-32-NEXT: br label [[OMP_IF_END]]9468// CHECK-32: omp_if.end:9469// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]9470// CHECK-32: omp.loop.exit:9471// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])9472// CHECK-32-NEXT: [[TMP50:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 49473// CHECK-32-NEXT: [[TMP51:%.*]] = icmp ne i32 [[TMP50]], 09474// CHECK-32-NEXT: br i1 [[TMP51]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]9475// CHECK-32: .omp.final.then:9476// CHECK-32-NEXT: store i32 10, ptr [[I]], align 49477// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]9478// CHECK-32: .omp.final.done:9479// CHECK-32-NEXT: ret void9480//9481//9482// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined9483// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {9484// CHECK-32-NEXT: entry:9485// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49486// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49487// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 49488// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 49489// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 49490// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49491// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 49492// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49493// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49494// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49495// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49496// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 49497// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 49498// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 49499// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 49500// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 49501// CHECK-32-NEXT: store i32 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 49502// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49503// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49504// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 49505// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 49506// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 49507// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 49508// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49509// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49510// CHECK-32-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 19511// CHECK-32-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i19512// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]9513// CHECK-32: omp_if.then:9514// CHECK-32-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49515// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 49516// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3:[0-9]+]], i32 [[TMP4]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)9517// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49518// CHECK-32-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 49519// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9520// CHECK-32: omp.inner.for.cond:9521// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227:![0-9]+]]9522// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4, !llvm.access.group [[ACC_GRP227]]9523// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP6]], [[TMP7]]9524// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9525// CHECK-32: omp.inner.for.body:9526// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227]]9527// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 19528// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9529// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP227]]9530// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9531// CHECK-32: omp.body.continue:9532// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9533// CHECK-32: omp.inner.for.inc:9534// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227]]9535// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP227]]9536// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]9537// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP227]]9538// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP228:![0-9]+]]9539// CHECK-32: omp.inner.for.end:9540// CHECK-32-NEXT: br label [[OMP_IF_END:%.*]]9541// CHECK-32: omp_if.else:9542// CHECK-32-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49543// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 49544// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP12]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)9545// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49546// CHECK-32-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 49547// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND2:%.*]]9548// CHECK-32: omp.inner.for.cond2:9549// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49550// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 49551// CHECK-32-NEXT: [[CMP3:%.*]] = icmp ule i32 [[TMP14]], [[TMP15]]9552// CHECK-32-NEXT: br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY4:%.*]], label [[OMP_INNER_FOR_END10:%.*]]9553// CHECK-32: omp.inner.for.body4:9554// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49555// CHECK-32-NEXT: [[MUL5:%.*]] = mul nsw i32 [[TMP16]], 19556// CHECK-32-NEXT: [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]9557// CHECK-32-NEXT: store i32 [[ADD6]], ptr [[I]], align 49558// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE7:%.*]]9559// CHECK-32: omp.body.continue7:9560// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC8:%.*]]9561// CHECK-32: omp.inner.for.inc8:9562// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49563// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 49564// CHECK-32-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]9565// CHECK-32-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 49566// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND2]], !llvm.loop [[LOOP230:![0-9]+]]9567// CHECK-32: omp.inner.for.end10:9568// CHECK-32-NEXT: br label [[OMP_IF_END]]9569// CHECK-32: omp_if.end:9570// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]9571// CHECK-32: omp.loop.exit:9572// CHECK-32-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49573// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 49574// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP20]])9575// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 49576// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 09577// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]9578// CHECK-32: .omp.final.then:9579// CHECK-32-NEXT: store i32 10, ptr [[I]], align 49580// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]9581// CHECK-32: .omp.final.done:9582// CHECK-32-NEXT: ret void9583//9584//9585// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l15_omp_outlined_omp_outlined19586// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {9587// CHECK-32-NEXT: entry:9588// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49589// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49590// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 49591// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 49592// CHECK-32-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 49593// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49594// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 49595// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49596// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49597// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49598// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49599// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 49600// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 49601// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 49602// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 49603// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 49604// CHECK-32-NEXT: store i32 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 49605// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49606// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49607// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 49608// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 49609// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 49610// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 49611// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49612// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49613// CHECK-32-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 19614// CHECK-32-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP2]] to i19615// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]9616// CHECK-32: omp_if.then:9617// CHECK-32-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49618// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 49619// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP4]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)9620// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49621// CHECK-32-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 49622// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9623// CHECK-32: omp.inner.for.cond:9624// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231:![0-9]+]]9625// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4, !llvm.access.group [[ACC_GRP231]]9626// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP6]], [[TMP7]]9627// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9628// CHECK-32: omp.inner.for.body:9629// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231]]9630// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 19631// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9632// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP231]]9633// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9634// CHECK-32: omp.body.continue:9635// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9636// CHECK-32: omp.inner.for.inc:9637// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231]]9638// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP231]]9639// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]9640// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP231]]9641// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP232:![0-9]+]]9642// CHECK-32: omp.inner.for.end:9643// CHECK-32-NEXT: br label [[OMP_IF_END:%.*]]9644// CHECK-32: omp_if.else:9645// CHECK-32-NEXT: [[TMP11:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49646// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP11]], align 49647// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP12]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)9648// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49649// CHECK-32-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 49650// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND2:%.*]]9651// CHECK-32: omp.inner.for.cond2:9652// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49653// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 49654// CHECK-32-NEXT: [[CMP3:%.*]] = icmp ule i32 [[TMP14]], [[TMP15]]9655// CHECK-32-NEXT: br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY4:%.*]], label [[OMP_INNER_FOR_END10:%.*]]9656// CHECK-32: omp.inner.for.body4:9657// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49658// CHECK-32-NEXT: [[MUL5:%.*]] = mul nsw i32 [[TMP16]], 19659// CHECK-32-NEXT: [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]9660// CHECK-32-NEXT: store i32 [[ADD6]], ptr [[I]], align 49661// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE7:%.*]]9662// CHECK-32: omp.body.continue7:9663// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC8:%.*]]9664// CHECK-32: omp.inner.for.inc8:9665// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 49666// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 49667// CHECK-32-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP17]], [[TMP18]]9668// CHECK-32-NEXT: store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 49669// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND2]], !llvm.loop [[LOOP234:![0-9]+]]9670// CHECK-32: omp.inner.for.end10:9671// CHECK-32-NEXT: br label [[OMP_IF_END]]9672// CHECK-32: omp_if.end:9673// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]9674// CHECK-32: omp.loop.exit:9675// CHECK-32-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49676// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 49677// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP20]])9678// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 49679// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 09680// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]9681// CHECK-32: .omp.final.then:9682// CHECK-32-NEXT: store i32 10, ptr [[I]], align 49683// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]9684// CHECK-32: .omp.final.done:9685// CHECK-32-NEXT: ret void9686//9687//9688// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l189689// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {9690// CHECK-32-NEXT: entry:9691// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 49692// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 49693// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 49694// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 49695// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_kernel_environment, ptr [[DYN_PTR]])9696// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -19697// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]9698// CHECK-32: user_code.entry:9699// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])9700// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 49701// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 49702// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]9703// CHECK-32-NEXT: call void @__kmpc_target_deinit()9704// CHECK-32-NEXT: ret void9705// CHECK-32: worker.exit:9706// CHECK-32-NEXT: ret void9707//9708//9709// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined9710// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {9711// CHECK-32-NEXT: entry:9712// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49713// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49714// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49715// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 49716// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 49717// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 49718// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49719// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49720// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 49721// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 49722// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 49723// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 49724// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 49725// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 49726// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49727// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49728// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()9729// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49730// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49731// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])9732// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49733// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 99734// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]9735// CHECK-32: cond.true:9736// CHECK-32-NEXT: br label [[COND_END:%.*]]9737// CHECK-32: cond.false:9738// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49739// CHECK-32-NEXT: br label [[COND_END]]9740// CHECK-32: cond.end:9741// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]9742// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 49743// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 49744// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 49745// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9746// CHECK-32: omp.inner.for.cond:9747// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235:![0-9]+]]9748// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 109749// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9750// CHECK-32: omp.inner.for.body:9751// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]9752// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]9753// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 09754// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr9755// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP235]]9756// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 19757// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr9758// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP235]]9759// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP235]]9760// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9761// CHECK-32: omp.inner.for.inc:9762// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235]]9763// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP235]]9764// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]9765// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235]]9766// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]9767// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP235]]9768// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]9769// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]9770// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]9771// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP235]]9772// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]9773// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]9774// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]9775// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 99776// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]9777// CHECK-32: cond.true5:9778// CHECK-32-NEXT: br label [[COND_END7:%.*]]9779// CHECK-32: cond.false6:9780// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]9781// CHECK-32-NEXT: br label [[COND_END7]]9782// CHECK-32: cond.end7:9783// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]9784// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP235]]9785// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP235]]9786// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP235]]9787// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP236:![0-9]+]]9788// CHECK-32: omp.inner.for.end:9789// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]9790// CHECK-32: omp.loop.exit:9791// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])9792// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 49793// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 09794// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]9795// CHECK-32: .omp.final.then:9796// CHECK-32-NEXT: store i32 10, ptr [[I]], align 49797// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]9798// CHECK-32: .omp.final.done:9799// CHECK-32-NEXT: ret void9800//9801//9802// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l18_omp_outlined_omp_outlined9803// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {9804// CHECK-32-NEXT: entry:9805// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49806// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49807// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 49808// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 49809// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49810// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 49811// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 49812// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 49813// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49814// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49815// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 49816// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 49817// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 49818// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 49819// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 49820// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 49821// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 49822// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 49823// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 49824// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 49825// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 49826// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49827// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49828// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49829// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 49830// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)9831// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 49832// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 99833// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]9834// CHECK-32: cond.true:9835// CHECK-32-NEXT: br label [[COND_END:%.*]]9836// CHECK-32: cond.false:9837// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 49838// CHECK-32-NEXT: br label [[COND_END]]9839// CHECK-32: cond.end:9840// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]9841// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 49842// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 49843// CHECK-32-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 49844// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9845// CHECK-32: omp.inner.for.cond:9846// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238:![0-9]+]]9847// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP238]]9848// CHECK-32-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]9849// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9850// CHECK-32: omp.inner.for.body:9851// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238]]9852// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 19853// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]9854// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP238]]9855// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]9856// CHECK-32: omp.body.continue:9857// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9858// CHECK-32: omp.inner.for.inc:9859// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238]]9860// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 19861// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP238]]9862// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP239:![0-9]+]]9863// CHECK-32: omp.inner.for.end:9864// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]9865// CHECK-32: omp.loop.exit:9866// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])9867// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 49868// CHECK-32-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 09869// CHECK-32-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]9870// CHECK-32: .omp.final.then:9871// CHECK-32-NEXT: store i32 10, ptr [[I]], align 49872// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]9873// CHECK-32: .omp.final.done:9874// CHECK-32-NEXT: ret void9875//9876//9877// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l219878// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {9879// CHECK-32-NEXT: entry:9880// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 49881// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 49882// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 49883// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 49884// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_kernel_environment, ptr [[DYN_PTR]])9885// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -19886// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]9887// CHECK-32: user_code.entry:9888// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])9889// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 49890// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 49891// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]9892// CHECK-32-NEXT: call void @__kmpc_target_deinit()9893// CHECK-32-NEXT: ret void9894// CHECK-32: worker.exit:9895// CHECK-32-NEXT: ret void9896//9897//9898// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined9899// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {9900// CHECK-32-NEXT: entry:9901// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49902// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49903// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49904// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 49905// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 49906// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 49907// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 49908// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 49909// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 49910// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 49911// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 49912// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 49913// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 49914// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 49915// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 49916// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 49917// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()9918// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 49919// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 49920// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])9921// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49922// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 99923// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]9924// CHECK-32: cond.true:9925// CHECK-32-NEXT: br label [[COND_END:%.*]]9926// CHECK-32: cond.false:9927// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 49928// CHECK-32-NEXT: br label [[COND_END]]9929// CHECK-32: cond.end:9930// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]9931// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 49932// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 49933// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 49934// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]9935// CHECK-32: omp.inner.for.cond:9936// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241:![0-9]+]]9937// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 109938// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]9939// CHECK-32: omp.inner.for.body:9940// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]9941// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]9942// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 09943// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr9944// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP241]]9945// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 19946// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr9947// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP241]]9948// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP241]]9949// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]9950// CHECK-32: omp.inner.for.inc:9951// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241]]9952// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP241]]9953// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]9954// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241]]9955// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]9956// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP241]]9957// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]9958// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]9959// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]9960// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP241]]9961// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]9962// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]9963// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]9964// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 99965// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]9966// CHECK-32: cond.true5:9967// CHECK-32-NEXT: br label [[COND_END7:%.*]]9968// CHECK-32: cond.false6:9969// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]9970// CHECK-32-NEXT: br label [[COND_END7]]9971// CHECK-32: cond.end7:9972// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]9973// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP241]]9974// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP241]]9975// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP241]]9976// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP242:![0-9]+]]9977// CHECK-32: omp.inner.for.end:9978// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]9979// CHECK-32: omp.loop.exit:9980// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])9981// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 49982// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 09983// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]9984// CHECK-32: .omp.final.then:9985// CHECK-32-NEXT: store i32 10, ptr [[I]], align 49986// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]9987// CHECK-32: .omp.final.done:9988// CHECK-32-NEXT: ret void9989//9990//9991// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l21_omp_outlined_omp_outlined9992// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {9993// CHECK-32-NEXT: entry:9994// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 49995// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 49996// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 49997// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 49998// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 49999// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410000// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 410001// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 410002// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410003// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410004// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410005// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410006// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410007// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 410008// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 410009// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 410010// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 410011// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 410012// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410013// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 410014// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 410015// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410016// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410017// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410018// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 410019// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)10020// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410021// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410022// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10023// CHECK-32: omp.inner.for.cond:10024// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244:![0-9]+]]10025// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4, !llvm.access.group [[ACC_GRP244]]10026// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]10027// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10028// CHECK-32: omp.inner.for.body:10029// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244]]10030// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 110031// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]10032// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP244]]10033// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]10034// CHECK-32: omp.body.continue:10035// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10036// CHECK-32: omp.inner.for.inc:10037// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244]]10038// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP244]]10039// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]10040// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP244]]10041// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP245:![0-9]+]]10042// CHECK-32: omp.inner.for.end:10043// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10044// CHECK-32: omp.loop.exit:10045// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])10046// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410047// CHECK-32-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 010048// CHECK-32-NEXT: br i1 [[TMP11]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10049// CHECK-32: .omp.final.then:10050// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410051// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10052// CHECK-32: .omp.final.done:10053// CHECK-32-NEXT: ret void10054//10055//10056// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2410057// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {10058// CHECK-32-NEXT: entry:10059// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 410060// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 410061// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 410062// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 410063// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_kernel_environment, ptr [[DYN_PTR]])10064// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -110065// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]10066// CHECK-32: user_code.entry:10067// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])10068// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 410069// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 410070// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]10071// CHECK-32-NEXT: call void @__kmpc_target_deinit()10072// CHECK-32-NEXT: ret void10073// CHECK-32: worker.exit:10074// CHECK-32-NEXT: ret void10075//10076//10077// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined10078// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {10079// CHECK-32-NEXT: entry:10080// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410081// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410082// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410083// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410084// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 410085// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 410086// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410087// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410088// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410089// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 410090// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410091// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410092// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 410093// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 410094// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410095// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410096// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()10097// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410098// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 410099// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])10100// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410101// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 910102// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]10103// CHECK-32: cond.true:10104// CHECK-32-NEXT: br label [[COND_END:%.*]]10105// CHECK-32: cond.false:10106// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410107// CHECK-32-NEXT: br label [[COND_END]]10108// CHECK-32: cond.end:10109// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]10110// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 410111// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410112// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410113// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10114// CHECK-32: omp.inner.for.cond:10115// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247:![0-9]+]]10116// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1010117// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10118// CHECK-32: omp.inner.for.body:10119// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]10120// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]10121// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 010122// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr10123// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP247]]10124// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 110125// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr10126// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP247]]10127// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP247]]10128// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10129// CHECK-32: omp.inner.for.inc:10130// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247]]10131// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP247]]10132// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]10133// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247]]10134// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]10135// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP247]]10136// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]10137// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]10138// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]10139// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP247]]10140// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]10141// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]10142// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]10143// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 910144// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]10145// CHECK-32: cond.true5:10146// CHECK-32-NEXT: br label [[COND_END7:%.*]]10147// CHECK-32: cond.false6:10148// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]10149// CHECK-32-NEXT: br label [[COND_END7]]10150// CHECK-32: cond.end7:10151// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]10152// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP247]]10153// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP247]]10154// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP247]]10155// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP248:![0-9]+]]10156// CHECK-32: omp.inner.for.end:10157// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10158// CHECK-32: omp.loop.exit:10159// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])10160// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410161// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 010162// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10163// CHECK-32: .omp.final.then:10164// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410165// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10166// CHECK-32: .omp.final.done:10167// CHECK-32-NEXT: ret void10168//10169//10170// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l24_omp_outlined_omp_outlined10171// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {10172// CHECK-32-NEXT: entry:10173// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410174// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410175// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 410176// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 410177// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410178// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410179// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 410180// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 410181// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410182// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410183// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410184// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410185// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410186// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 410187// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 410188// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 410189// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 410190// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 410191// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410192// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 410193// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 410194// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410195// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410196// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410197// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 410198// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410199// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 410200// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)10201// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]10202// CHECK-32: omp.dispatch.cond:10203// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])10204// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 010205// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]10206// CHECK-32: omp.dispatch.body:10207// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410208// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 410209// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10210// CHECK-32: omp.inner.for.cond:10211// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250:![0-9]+]]10212// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP250]]10213// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]10214// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10215// CHECK-32: omp.inner.for.body:10216// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250]]10217// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 110218// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]10219// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP250]]10220// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]10221// CHECK-32: omp.body.continue:10222// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10223// CHECK-32: omp.inner.for.inc:10224// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250]]10225// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 110226// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP250]]10227// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP251:![0-9]+]]10228// CHECK-32: omp.inner.for.end:10229// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]10230// CHECK-32: omp.dispatch.inc:10231// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]10232// CHECK-32: omp.dispatch.end:10233// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])10234// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410235// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 010236// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10237// CHECK-32: .omp.final.then:10238// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410239// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10240// CHECK-32: .omp.final.done:10241// CHECK-32-NEXT: ret void10242//10243//10244// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l2710245// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {10246// CHECK-32-NEXT: entry:10247// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 410248// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 410249// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 410250// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 410251// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_kernel_environment, ptr [[DYN_PTR]])10252// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -110253// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]10254// CHECK-32: user_code.entry:10255// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])10256// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 410257// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 410258// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]10259// CHECK-32-NEXT: call void @__kmpc_target_deinit()10260// CHECK-32-NEXT: ret void10261// CHECK-32: worker.exit:10262// CHECK-32-NEXT: ret void10263//10264//10265// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined10266// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {10267// CHECK-32-NEXT: entry:10268// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410269// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410270// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410271// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410272// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 410273// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 410274// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410275// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410276// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410277// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 410278// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410279// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410280// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 410281// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 410282// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410283// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410284// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()10285// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410286// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 410287// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])10288// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410289// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 910290// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]10291// CHECK-32: cond.true:10292// CHECK-32-NEXT: br label [[COND_END:%.*]]10293// CHECK-32: cond.false:10294// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410295// CHECK-32-NEXT: br label [[COND_END]]10296// CHECK-32: cond.end:10297// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]10298// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 410299// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410300// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410301// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10302// CHECK-32: omp.inner.for.cond:10303// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253:![0-9]+]]10304// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1010305// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10306// CHECK-32: omp.inner.for.body:10307// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]10308// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]10309// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 010310// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr10311// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP253]]10312// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 110313// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr10314// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP253]]10315// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP253]]10316// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10317// CHECK-32: omp.inner.for.inc:10318// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253]]10319// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP253]]10320// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]10321// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253]]10322// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]10323// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP253]]10324// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]10325// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]10326// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]10327// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP253]]10328// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]10329// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]10330// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]10331// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 910332// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]10333// CHECK-32: cond.true5:10334// CHECK-32-NEXT: br label [[COND_END7:%.*]]10335// CHECK-32: cond.false6:10336// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]10337// CHECK-32-NEXT: br label [[COND_END7]]10338// CHECK-32: cond.end7:10339// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]10340// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP253]]10341// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP253]]10342// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP253]]10343// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP254:![0-9]+]]10344// CHECK-32: omp.inner.for.end:10345// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10346// CHECK-32: omp.loop.exit:10347// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])10348// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410349// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 010350// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10351// CHECK-32: .omp.final.then:10352// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410353// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10354// CHECK-32: .omp.final.done:10355// CHECK-32-NEXT: ret void10356//10357//10358// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l27_omp_outlined_omp_outlined10359// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {10360// CHECK-32-NEXT: entry:10361// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410362// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410363// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 410364// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 410365// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410366// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410367// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 410368// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 410369// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410370// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410371// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410372// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410373// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410374// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 410375// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 410376// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 410377// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 410378// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 410379// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410380// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 410381// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 410382// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410383// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410384// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410385// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 410386// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410387// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 410388// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)10389// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]10390// CHECK-32: omp.dispatch.cond:10391// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])10392// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 010393// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]10394// CHECK-32: omp.dispatch.body:10395// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410396// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 410397// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10398// CHECK-32: omp.inner.for.cond:10399// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256:![0-9]+]]10400// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP256]]10401// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]10402// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10403// CHECK-32: omp.inner.for.body:10404// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256]]10405// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 110406// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]10407// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP256]]10408// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]10409// CHECK-32: omp.body.continue:10410// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10411// CHECK-32: omp.inner.for.inc:10412// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256]]10413// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 110414// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP256]]10415// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP257:![0-9]+]]10416// CHECK-32: omp.inner.for.end:10417// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]10418// CHECK-32: omp.dispatch.inc:10419// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]10420// CHECK-32: omp.dispatch.end:10421// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])10422// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410423// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 010424// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10425// CHECK-32: .omp.final.then:10426// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410427// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10428// CHECK-32: .omp.final.done:10429// CHECK-32-NEXT: ret void10430//10431//10432// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l3010433// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {10434// CHECK-32-NEXT: entry:10435// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 410436// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 410437// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 410438// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 410439// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_kernel_environment, ptr [[DYN_PTR]])10440// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -110441// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]10442// CHECK-32: user_code.entry:10443// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])10444// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 410445// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 410446// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]10447// CHECK-32-NEXT: call void @__kmpc_target_deinit()10448// CHECK-32-NEXT: ret void10449// CHECK-32: worker.exit:10450// CHECK-32-NEXT: ret void10451//10452//10453// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined10454// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {10455// CHECK-32-NEXT: entry:10456// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410457// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410458// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410459// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410460// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 410461// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 410462// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410463// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410464// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410465// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 410466// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410467// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410468// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 410469// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 410470// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410471// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410472// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()10473// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410474// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 410475// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])10476// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410477// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 910478// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]10479// CHECK-32: cond.true:10480// CHECK-32-NEXT: br label [[COND_END:%.*]]10481// CHECK-32: cond.false:10482// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410483// CHECK-32-NEXT: br label [[COND_END]]10484// CHECK-32: cond.end:10485// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]10486// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 410487// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410488// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410489// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10490// CHECK-32: omp.inner.for.cond:10491// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259:![0-9]+]]10492// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1010493// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10494// CHECK-32: omp.inner.for.body:10495// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]10496// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]10497// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 010498// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr10499// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP259]]10500// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 110501// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr10502// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP259]]10503// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP259]]10504// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10505// CHECK-32: omp.inner.for.inc:10506// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259]]10507// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP259]]10508// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]10509// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259]]10510// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]10511// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP259]]10512// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]10513// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]10514// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]10515// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP259]]10516// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]10517// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]10518// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]10519// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 910520// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]10521// CHECK-32: cond.true5:10522// CHECK-32-NEXT: br label [[COND_END7:%.*]]10523// CHECK-32: cond.false6:10524// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]10525// CHECK-32-NEXT: br label [[COND_END7]]10526// CHECK-32: cond.end7:10527// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]10528// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP259]]10529// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP259]]10530// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP259]]10531// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP260:![0-9]+]]10532// CHECK-32: omp.inner.for.end:10533// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10534// CHECK-32: omp.loop.exit:10535// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])10536// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410537// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 010538// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10539// CHECK-32: .omp.final.then:10540// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410541// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10542// CHECK-32: .omp.final.done:10543// CHECK-32-NEXT: ret void10544//10545//10546// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l30_omp_outlined_omp_outlined10547// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {10548// CHECK-32-NEXT: entry:10549// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410550// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410551// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 410552// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 410553// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410554// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410555// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 410556// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 410557// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410558// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410559// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410560// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410561// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410562// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 410563// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 410564// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 410565// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 410566// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 410567// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410568// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 410569// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 410570// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410571// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410572// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410573// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 410574// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410575// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 410576// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)10577// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]10578// CHECK-32: omp.dispatch.cond:10579// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])10580// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 010581// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]10582// CHECK-32: omp.dispatch.body:10583// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410584// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 410585// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10586// CHECK-32: omp.inner.for.cond:10587// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262:![0-9]+]]10588// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP262]]10589// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]10590// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10591// CHECK-32: omp.inner.for.body:10592// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262]]10593// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 110594// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]10595// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP262]]10596// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]10597// CHECK-32: omp.body.continue:10598// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10599// CHECK-32: omp.inner.for.inc:10600// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262]]10601// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 110602// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP262]]10603// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP263:![0-9]+]]10604// CHECK-32: omp.inner.for.end:10605// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]10606// CHECK-32: omp.dispatch.inc:10607// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]10608// CHECK-32: omp.dispatch.end:10609// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])10610// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410611// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 010612// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10613// CHECK-32: .omp.final.then:10614// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410615// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10616// CHECK-32: .omp.final.done:10617// CHECK-32-NEXT: ret void10618//10619//10620// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l3310621// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {10622// CHECK-32-NEXT: entry:10623// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 410624// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 410625// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 410626// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 410627// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_kernel_environment, ptr [[DYN_PTR]])10628// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -110629// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]10630// CHECK-32: user_code.entry:10631// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])10632// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 410633// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 410634// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]10635// CHECK-32-NEXT: call void @__kmpc_target_deinit()10636// CHECK-32-NEXT: ret void10637// CHECK-32: worker.exit:10638// CHECK-32-NEXT: ret void10639//10640//10641// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined10642// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {10643// CHECK-32-NEXT: entry:10644// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410645// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410646// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410647// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410648// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 410649// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 410650// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410651// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410652// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410653// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 410654// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410655// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410656// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 410657// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 410658// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410659// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410660// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()10661// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410662// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 410663// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])10664// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410665// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 910666// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]10667// CHECK-32: cond.true:10668// CHECK-32-NEXT: br label [[COND_END:%.*]]10669// CHECK-32: cond.false:10670// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410671// CHECK-32-NEXT: br label [[COND_END]]10672// CHECK-32: cond.end:10673// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]10674// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 410675// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410676// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410677// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10678// CHECK-32: omp.inner.for.cond:10679// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265:![0-9]+]]10680// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1010681// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10682// CHECK-32: omp.inner.for.body:10683// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]10684// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]10685// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 010686// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr10687// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP265]]10688// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 110689// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr10690// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP265]]10691// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP265]]10692// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10693// CHECK-32: omp.inner.for.inc:10694// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265]]10695// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP265]]10696// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]10697// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265]]10698// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]10699// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP265]]10700// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]10701// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]10702// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]10703// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP265]]10704// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]10705// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]10706// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]10707// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 910708// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]10709// CHECK-32: cond.true5:10710// CHECK-32-NEXT: br label [[COND_END7:%.*]]10711// CHECK-32: cond.false6:10712// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]10713// CHECK-32-NEXT: br label [[COND_END7]]10714// CHECK-32: cond.end7:10715// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]10716// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP265]]10717// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP265]]10718// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP265]]10719// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP266:![0-9]+]]10720// CHECK-32: omp.inner.for.end:10721// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10722// CHECK-32: omp.loop.exit:10723// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])10724// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410725// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 010726// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10727// CHECK-32: .omp.final.then:10728// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410729// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10730// CHECK-32: .omp.final.done:10731// CHECK-32-NEXT: ret void10732//10733//10734// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l33_omp_outlined_omp_outlined10735// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {10736// CHECK-32-NEXT: entry:10737// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410738// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410739// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 410740// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 410741// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410742// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410743// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 410744// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 410745// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410746// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410747// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410748// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410749// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410750// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 410751// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 410752// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 410753// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 410754// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 410755// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410756// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 410757// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 410758// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410759// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410760// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410761// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 410762// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410763// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 410764// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)10765// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]10766// CHECK-32: omp.dispatch.cond:10767// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])10768// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 010769// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]10770// CHECK-32: omp.dispatch.body:10771// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410772// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 410773// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10774// CHECK-32: omp.inner.for.cond:10775// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268:![0-9]+]]10776// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP268]]10777// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]10778// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10779// CHECK-32: omp.inner.for.body:10780// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268]]10781// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 110782// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]10783// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP268]]10784// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]10785// CHECK-32: omp.body.continue:10786// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10787// CHECK-32: omp.inner.for.inc:10788// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268]]10789// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 110790// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP268]]10791// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP269:![0-9]+]]10792// CHECK-32: omp.inner.for.end:10793// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]10794// CHECK-32: omp.dispatch.inc:10795// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]10796// CHECK-32: omp.dispatch.end:10797// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])10798// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410799// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 010800// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]10801// CHECK-32: .omp.final.then:10802// CHECK-32-NEXT: store i32 10, ptr [[I]], align 410803// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]10804// CHECK-32: .omp.final.done:10805// CHECK-32-NEXT: ret void10806//10807//10808// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l3710809// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i32 noundef [[A:%.*]]) #[[ATTR0]] {10810// CHECK-32-NEXT: entry:10811// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 410812// CHECK-32-NEXT: [[A_ADDR:%.*]] = alloca i32, align 410813// CHECK-32-NEXT: [[A_CASTED:%.*]] = alloca i32, align 410814// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 410815// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 410816// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 410817// CHECK-32-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 410818// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_kernel_environment, ptr [[DYN_PTR]])10819// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -110820// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]10821// CHECK-32: user_code.entry:10822// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])10823// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[A_ADDR]], align 410824// CHECK-32-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 410825// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 410826// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 410827// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 410828// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], i32 [[TMP3]]) #[[ATTR2]]10829// CHECK-32-NEXT: call void @__kmpc_target_deinit()10830// CHECK-32-NEXT: ret void10831// CHECK-32: worker.exit:10832// CHECK-32-NEXT: ret void10833//10834//10835// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined10836// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR1]] {10837// CHECK-32-NEXT: entry:10838// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410839// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410840// CHECK-32-NEXT: [[A_ADDR:%.*]] = alloca i32, align 410841// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410842// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410843// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 410844// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 410845// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410846// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410847// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410848// CHECK-32-NEXT: [[A_CASTED:%.*]] = alloca i32, align 410849// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [3 x ptr], align 410850// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410851// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410852// CHECK-32-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 410853// CHECK-32-NEXT: [[A1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)10854// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 410855// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 410856// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410857// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410858// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()10859// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410860// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 410861// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])10862// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410863// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 910864// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]10865// CHECK-32: cond.true:10866// CHECK-32-NEXT: br label [[COND_END:%.*]]10867// CHECK-32: cond.false:10868// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410869// CHECK-32-NEXT: br label [[COND_END]]10870// CHECK-32: cond.end:10871// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]10872// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 410873// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410874// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410875// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10876// CHECK-32: omp.inner.for.cond:10877// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 410878// CHECK-32-NEXT: [[CMP2:%.*]] = icmp slt i32 [[TMP5]], 1010879// CHECK-32-NEXT: br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10880// CHECK-32: omp.inner.for.body:10881// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410882// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410883// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[A1]], align 410884// CHECK-32-NEXT: store i32 [[TMP8]], ptr [[A_CASTED]], align 410885// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[A_CASTED]], align 410886// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 010887// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP6]] to ptr10888// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 410889// CHECK-32-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 110890// CHECK-32-NEXT: [[TMP13:%.*]] = inttoptr i32 [[TMP7]] to ptr10891// CHECK-32-NEXT: store ptr [[TMP13]], ptr [[TMP12]], align 410892// CHECK-32-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 210893// CHECK-32-NEXT: [[TMP15:%.*]] = inttoptr i32 [[TMP9]] to ptr10894// CHECK-32-NEXT: store ptr [[TMP15]], ptr [[TMP14]], align 410895// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 3)10896// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10897// CHECK-32: omp.inner.for.inc:10898// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 410899// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 410900// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]10901// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 410902// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410903// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 410904// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP18]], [[TMP19]]10905// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_LB]], align 410906// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410907// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 410908// CHECK-32-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP20]], [[TMP21]]10909// CHECK-32-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_COMB_UB]], align 410910// CHECK-32-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410911// CHECK-32-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP22]], 910912// CHECK-32-NEXT: br i1 [[CMP5]], label [[COND_TRUE6:%.*]], label [[COND_FALSE7:%.*]]10913// CHECK-32: cond.true6:10914// CHECK-32-NEXT: br label [[COND_END8:%.*]]10915// CHECK-32: cond.false7:10916// CHECK-32-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 410917// CHECK-32-NEXT: br label [[COND_END8]]10918// CHECK-32: cond.end8:10919// CHECK-32-NEXT: [[COND9:%.*]] = phi i32 [ 9, [[COND_TRUE6]] ], [ [[TMP23]], [[COND_FALSE7]] ]10920// CHECK-32-NEXT: store i32 [[COND9]], ptr [[DOTOMP_COMB_UB]], align 410921// CHECK-32-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 410922// CHECK-32-NEXT: store i32 [[TMP24]], ptr [[DOTOMP_IV]], align 410923// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]10924// CHECK-32: omp.inner.for.end:10925// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10926// CHECK-32: omp.loop.exit:10927// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])10928// CHECK-32-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 410929// CHECK-32-NEXT: [[TMP26:%.*]] = icmp ne i32 [[TMP25]], 010930// CHECK-32-NEXT: br i1 [[TMP26]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]10931// CHECK-32: .omp.lastprivate.then:10932// CHECK-32-NEXT: [[TMP27:%.*]] = load i32, ptr [[A1]], align 410933// CHECK-32-NEXT: store i32 [[TMP27]], ptr [[A_ADDR]], align 410934// CHECK-32-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]10935// CHECK-32: .omp.lastprivate.done:10936// CHECK-32-NEXT: call void @__kmpc_free_shared(ptr [[A1]], i32 4)10937// CHECK-32-NEXT: ret void10938//10939//10940// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l37_omp_outlined_omp_outlined10941// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR1]] {10942// CHECK-32-NEXT: entry:10943// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 410944// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 410945// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 410946// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 410947// CHECK-32-NEXT: [[A_ADDR:%.*]] = alloca i32, align 410948// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 410949// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 410950// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 410951// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 410952// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 410953// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 410954// CHECK-32-NEXT: [[A1:%.*]] = alloca i32, align 410955// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 410956// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 410957// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 410958// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 410959// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 410960// CHECK-32-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 410961// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 410962// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 410963// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 410964// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410965// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 410966// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 410967// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 410968// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 410969// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 410970// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 410971// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)10972// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 410973// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 410974// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]10975// CHECK-32: omp.inner.for.cond:10976// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 410977// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 410978// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]10979// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]10980// CHECK-32: omp.inner.for.body:10981// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 410982// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 110983// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]10984// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 410985// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[I]], align 410986// CHECK-32-NEXT: store i32 [[TMP8]], ptr [[A1]], align 410987// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]10988// CHECK-32: omp.body.continue:10989// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]10990// CHECK-32: omp.inner.for.inc:10991// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 410992// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 410993// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]10994// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 410995// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]10996// CHECK-32: omp.inner.for.end:10997// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]10998// CHECK-32: omp.loop.exit:10999// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])11000// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 411001// CHECK-32-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 011002// CHECK-32-NEXT: br i1 [[TMP12]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]11003// CHECK-32: .omp.lastprivate.then:11004// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[A1]], align 411005// CHECK-32-NEXT: store i32 [[TMP13]], ptr [[A_ADDR]], align 411006// CHECK-32-NEXT: br label [[DOTOMP_LASTPRIVATE_DONE]]11007// CHECK-32: .omp.lastprivate.done:11008// CHECK-32-NEXT: ret void11009//11010//11011// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l4011012// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {11013// CHECK-32-NEXT: entry:11014// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 411015// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 411016// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 411017// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 411018// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_kernel_environment, ptr [[DYN_PTR]])11019// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -111020// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]11021// CHECK-32: user_code.entry:11022// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])11023// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 411024// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 411025// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]11026// CHECK-32-NEXT: call void @__kmpc_target_deinit()11027// CHECK-32-NEXT: ret void11028// CHECK-32: worker.exit:11029// CHECK-32-NEXT: ret void11030//11031//11032// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined11033// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {11034// CHECK-32-NEXT: entry:11035// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411036// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411037// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411038// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411039// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 411040// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 411041// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411042// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411043// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411044// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 411045// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411046// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411047// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 411048// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 411049// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411050// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411051// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()11052// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411053// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 411054// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])11055// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411056// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 911057// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11058// CHECK-32: cond.true:11059// CHECK-32-NEXT: br label [[COND_END:%.*]]11060// CHECK-32: cond.false:11061// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411062// CHECK-32-NEXT: br label [[COND_END]]11063// CHECK-32: cond.end:11064// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]11065// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 411066// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411067// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411068// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11069// CHECK-32: omp.inner.for.cond:11070// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411071// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1011072// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11073// CHECK-32: omp.inner.for.body:11074// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411075// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411076// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 011077// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr11078// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 411079// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 111080// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr11081// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 411082// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)11083// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11084// CHECK-32: omp.inner.for.inc:11085// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411086// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411087// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]11088// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 411089// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411090// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411091// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]11092// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 411093// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411094// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411095// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]11096// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 411097// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411098// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 911099// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]11100// CHECK-32: cond.true5:11101// CHECK-32-NEXT: br label [[COND_END7:%.*]]11102// CHECK-32: cond.false6:11103// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411104// CHECK-32-NEXT: br label [[COND_END7]]11105// CHECK-32: cond.end7:11106// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]11107// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 411108// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411109// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 411110// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11111// CHECK-32: omp.inner.for.end:11112// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11113// CHECK-32: omp.loop.exit:11114// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])11115// CHECK-32-NEXT: ret void11116//11117//11118// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l40_omp_outlined_omp_outlined11119// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {11120// CHECK-32-NEXT: entry:11121// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411122// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411123// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 411124// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 411125// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411126// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411127// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 411128// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 411129// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411130// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411131// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411132// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411133// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411134// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 411135// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 411136// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 411137// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 411138// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 411139// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 411140// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 411141// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 411142// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411143// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411144// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411145// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 411146// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)11147// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 411148// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 911149// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11150// CHECK-32: cond.true:11151// CHECK-32-NEXT: br label [[COND_END:%.*]]11152// CHECK-32: cond.false:11153// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 411154// CHECK-32-NEXT: br label [[COND_END]]11155// CHECK-32: cond.end:11156// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]11157// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 411158// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411159// CHECK-32-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 411160// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11161// CHECK-32: omp.inner.for.cond:11162// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411163// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 411164// CHECK-32-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]11165// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11166// CHECK-32: omp.inner.for.body:11167// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411168// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 111169// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]11170// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 411171// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]11172// CHECK-32: omp.body.continue:11173// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11174// CHECK-32: omp.inner.for.inc:11175// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411176// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 111177// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 411178// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11179// CHECK-32: omp.inner.for.end:11180// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11181// CHECK-32: omp.loop.exit:11182// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])11183// CHECK-32-NEXT: ret void11184//11185//11186// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l4311187// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {11188// CHECK-32-NEXT: entry:11189// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 411190// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 411191// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 411192// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 411193// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_kernel_environment, ptr [[DYN_PTR]])11194// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -111195// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]11196// CHECK-32: user_code.entry:11197// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])11198// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 411199// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 411200// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]11201// CHECK-32-NEXT: call void @__kmpc_target_deinit()11202// CHECK-32-NEXT: ret void11203// CHECK-32: worker.exit:11204// CHECK-32-NEXT: ret void11205//11206//11207// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined11208// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {11209// CHECK-32-NEXT: entry:11210// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411211// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411212// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411213// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411214// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 411215// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 411216// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411217// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411218// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411219// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 411220// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411221// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411222// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 411223// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 411224// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411225// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411226// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()11227// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411228// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 411229// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])11230// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411231// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 911232// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11233// CHECK-32: cond.true:11234// CHECK-32-NEXT: br label [[COND_END:%.*]]11235// CHECK-32: cond.false:11236// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411237// CHECK-32-NEXT: br label [[COND_END]]11238// CHECK-32: cond.end:11239// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]11240// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 411241// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411242// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411243// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11244// CHECK-32: omp.inner.for.cond:11245// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411246// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1011247// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11248// CHECK-32: omp.inner.for.body:11249// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411250// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411251// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 011252// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr11253// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 411254// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 111255// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr11256// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 411257// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)11258// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11259// CHECK-32: omp.inner.for.inc:11260// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411261// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411262// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]11263// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 411264// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411265// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411266// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]11267// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 411268// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411269// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411270// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]11271// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 411272// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411273// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 911274// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]11275// CHECK-32: cond.true5:11276// CHECK-32-NEXT: br label [[COND_END7:%.*]]11277// CHECK-32: cond.false6:11278// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411279// CHECK-32-NEXT: br label [[COND_END7]]11280// CHECK-32: cond.end7:11281// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]11282// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 411283// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411284// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 411285// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11286// CHECK-32: omp.inner.for.end:11287// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11288// CHECK-32: omp.loop.exit:11289// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])11290// CHECK-32-NEXT: ret void11291//11292//11293// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l43_omp_outlined_omp_outlined11294// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {11295// CHECK-32-NEXT: entry:11296// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411297// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411298// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 411299// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 411300// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411301// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411302// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 411303// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 411304// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411305// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411306// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411307// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411308// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411309// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 411310// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 411311// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 411312// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 411313// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 411314// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 411315// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 411316// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 411317// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411318// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411319// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411320// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 411321// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)11322// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411323// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411324// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11325// CHECK-32: omp.inner.for.cond:11326// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411327// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 411328// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]11329// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11330// CHECK-32: omp.inner.for.body:11331// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411332// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 111333// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]11334// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 411335// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]11336// CHECK-32: omp.body.continue:11337// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11338// CHECK-32: omp.inner.for.inc:11339// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411340// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411341// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]11342// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 411343// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11344// CHECK-32: omp.inner.for.end:11345// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11346// CHECK-32: omp.loop.exit:11347// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])11348// CHECK-32-NEXT: ret void11349//11350//11351// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l4611352// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {11353// CHECK-32-NEXT: entry:11354// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 411355// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 411356// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 411357// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 411358// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_kernel_environment, ptr [[DYN_PTR]])11359// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -111360// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]11361// CHECK-32: user_code.entry:11362// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])11363// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 411364// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 411365// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]11366// CHECK-32-NEXT: call void @__kmpc_target_deinit()11367// CHECK-32-NEXT: ret void11368// CHECK-32: worker.exit:11369// CHECK-32-NEXT: ret void11370//11371//11372// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined11373// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {11374// CHECK-32-NEXT: entry:11375// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411376// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411377// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411378// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411379// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 411380// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 411381// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411382// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411383// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411384// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 411385// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411386// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411387// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 411388// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 411389// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411390// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411391// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()11392// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411393// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 411394// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])11395// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411396// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 911397// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11398// CHECK-32: cond.true:11399// CHECK-32-NEXT: br label [[COND_END:%.*]]11400// CHECK-32: cond.false:11401// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411402// CHECK-32-NEXT: br label [[COND_END]]11403// CHECK-32: cond.end:11404// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]11405// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 411406// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411407// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411408// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11409// CHECK-32: omp.inner.for.cond:11410// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411411// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1011412// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11413// CHECK-32: omp.inner.for.body:11414// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411415// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411416// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 011417// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr11418// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 411419// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 111420// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr11421// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 411422// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)11423// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11424// CHECK-32: omp.inner.for.inc:11425// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411426// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411427// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]11428// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 411429// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411430// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411431// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]11432// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 411433// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411434// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411435// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]11436// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 411437// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411438// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 911439// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]11440// CHECK-32: cond.true5:11441// CHECK-32-NEXT: br label [[COND_END7:%.*]]11442// CHECK-32: cond.false6:11443// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411444// CHECK-32-NEXT: br label [[COND_END7]]11445// CHECK-32: cond.end7:11446// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]11447// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 411448// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411449// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 411450// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11451// CHECK-32: omp.inner.for.end:11452// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11453// CHECK-32: omp.loop.exit:11454// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])11455// CHECK-32-NEXT: ret void11456//11457//11458// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l46_omp_outlined_omp_outlined11459// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {11460// CHECK-32-NEXT: entry:11461// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411462// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411463// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 411464// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 411465// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411466// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411467// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 411468// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 411469// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411470// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411471// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411472// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411473// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411474// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 411475// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 411476// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 411477// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 411478// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 411479// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 411480// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 411481// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 411482// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411483// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411484// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411485// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 411486// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411487// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 411488// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)11489// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]11490// CHECK-32: omp.dispatch.cond:11491// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])11492// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 011493// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]11494// CHECK-32: omp.dispatch.body:11495// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411496// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 411497// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11498// CHECK-32: omp.inner.for.cond:11499// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271:![0-9]+]]11500// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP271]]11501// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]11502// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11503// CHECK-32: omp.inner.for.body:11504// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271]]11505// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 111506// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]11507// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP271]]11508// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]11509// CHECK-32: omp.body.continue:11510// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11511// CHECK-32: omp.inner.for.inc:11512// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271]]11513// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 111514// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP271]]11515// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP272:![0-9]+]]11516// CHECK-32: omp.inner.for.end:11517// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]11518// CHECK-32: omp.dispatch.inc:11519// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]11520// CHECK-32: omp.dispatch.end:11521// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])11522// CHECK-32-NEXT: ret void11523//11524//11525// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l4911526// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {11527// CHECK-32-NEXT: entry:11528// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 411529// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 411530// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 411531// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 411532// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_kernel_environment, ptr [[DYN_PTR]])11533// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -111534// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]11535// CHECK-32: user_code.entry:11536// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])11537// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 411538// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 411539// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]11540// CHECK-32-NEXT: call void @__kmpc_target_deinit()11541// CHECK-32-NEXT: ret void11542// CHECK-32: worker.exit:11543// CHECK-32-NEXT: ret void11544//11545//11546// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined11547// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {11548// CHECK-32-NEXT: entry:11549// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411550// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411551// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411552// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411553// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 411554// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 411555// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411556// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411557// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411558// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 411559// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411560// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411561// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 411562// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 411563// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411564// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411565// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()11566// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411567// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 411568// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])11569// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411570// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 911571// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11572// CHECK-32: cond.true:11573// CHECK-32-NEXT: br label [[COND_END:%.*]]11574// CHECK-32: cond.false:11575// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411576// CHECK-32-NEXT: br label [[COND_END]]11577// CHECK-32: cond.end:11578// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]11579// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 411580// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411581// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411582// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11583// CHECK-32: omp.inner.for.cond:11584// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411585// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1011586// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11587// CHECK-32: omp.inner.for.body:11588// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411589// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411590// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 011591// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr11592// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 411593// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 111594// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr11595// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 411596// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)11597// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11598// CHECK-32: omp.inner.for.inc:11599// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411600// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411601// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]11602// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 411603// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411604// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411605// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]11606// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 411607// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411608// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411609// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]11610// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 411611// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411612// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 911613// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]11614// CHECK-32: cond.true5:11615// CHECK-32-NEXT: br label [[COND_END7:%.*]]11616// CHECK-32: cond.false6:11617// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411618// CHECK-32-NEXT: br label [[COND_END7]]11619// CHECK-32: cond.end7:11620// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]11621// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 411622// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411623// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 411624// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11625// CHECK-32: omp.inner.for.end:11626// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11627// CHECK-32: omp.loop.exit:11628// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])11629// CHECK-32-NEXT: ret void11630//11631//11632// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l49_omp_outlined_omp_outlined11633// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {11634// CHECK-32-NEXT: entry:11635// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411636// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411637// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 411638// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 411639// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411640// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411641// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 411642// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 411643// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411644// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411645// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411646// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411647// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411648// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 411649// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 411650// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 411651// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 411652// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 411653// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 411654// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 411655// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 411656// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411657// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411658// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411659// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 411660// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411661// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 411662// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)11663// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]11664// CHECK-32: omp.dispatch.cond:11665// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])11666// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 011667// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]11668// CHECK-32: omp.dispatch.body:11669// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411670// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 411671// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11672// CHECK-32: omp.inner.for.cond:11673// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274:![0-9]+]]11674// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP274]]11675// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]11676// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11677// CHECK-32: omp.inner.for.body:11678// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274]]11679// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 111680// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]11681// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP274]]11682// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]11683// CHECK-32: omp.body.continue:11684// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11685// CHECK-32: omp.inner.for.inc:11686// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274]]11687// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 111688// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP274]]11689// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP275:![0-9]+]]11690// CHECK-32: omp.inner.for.end:11691// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]11692// CHECK-32: omp.dispatch.inc:11693// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]11694// CHECK-32: omp.dispatch.end:11695// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])11696// CHECK-32-NEXT: ret void11697//11698//11699// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l5211700// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {11701// CHECK-32-NEXT: entry:11702// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 411703// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 411704// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 411705// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 411706// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_kernel_environment, ptr [[DYN_PTR]])11707// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -111708// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]11709// CHECK-32: user_code.entry:11710// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])11711// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 411712// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 411713// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]11714// CHECK-32-NEXT: call void @__kmpc_target_deinit()11715// CHECK-32-NEXT: ret void11716// CHECK-32: worker.exit:11717// CHECK-32-NEXT: ret void11718//11719//11720// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined11721// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {11722// CHECK-32-NEXT: entry:11723// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411724// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411725// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411726// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411727// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 411728// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 411729// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411730// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411731// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411732// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 411733// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411734// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411735// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 411736// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 411737// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411738// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411739// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()11740// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411741// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 411742// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])11743// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411744// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 911745// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11746// CHECK-32: cond.true:11747// CHECK-32-NEXT: br label [[COND_END:%.*]]11748// CHECK-32: cond.false:11749// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411750// CHECK-32-NEXT: br label [[COND_END]]11751// CHECK-32: cond.end:11752// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]11753// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 411754// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411755// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411756// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11757// CHECK-32: omp.inner.for.cond:11758// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411759// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1011760// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11761// CHECK-32: omp.inner.for.body:11762// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411763// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411764// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 011765// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr11766// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 411767// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 111768// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr11769// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 411770// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)11771// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11772// CHECK-32: omp.inner.for.inc:11773// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411774// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411775// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]11776// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 411777// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411778// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411779// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]11780// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 411781// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411782// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411783// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]11784// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 411785// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411786// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 911787// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]11788// CHECK-32: cond.true5:11789// CHECK-32-NEXT: br label [[COND_END7:%.*]]11790// CHECK-32: cond.false6:11791// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411792// CHECK-32-NEXT: br label [[COND_END7]]11793// CHECK-32: cond.end7:11794// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]11795// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 411796// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411797// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 411798// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11799// CHECK-32: omp.inner.for.end:11800// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11801// CHECK-32: omp.loop.exit:11802// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])11803// CHECK-32-NEXT: ret void11804//11805//11806// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l52_omp_outlined_omp_outlined11807// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {11808// CHECK-32-NEXT: entry:11809// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411810// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411811// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 411812// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 411813// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411814// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411815// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 411816// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 411817// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411818// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411819// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411820// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411821// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411822// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 411823// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 411824// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 411825// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 411826// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 411827// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 411828// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 411829// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 411830// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411831// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411832// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411833// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 411834// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411835// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 411836// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)11837// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]11838// CHECK-32: omp.dispatch.cond:11839// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])11840// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 011841// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]11842// CHECK-32: omp.dispatch.body:11843// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 411844// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 411845// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11846// CHECK-32: omp.inner.for.cond:11847// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277:![0-9]+]]11848// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP277]]11849// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]11850// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11851// CHECK-32: omp.inner.for.body:11852// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277]]11853// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 111854// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]11855// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP277]]11856// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]11857// CHECK-32: omp.body.continue:11858// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11859// CHECK-32: omp.inner.for.inc:11860// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277]]11861// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 111862// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP277]]11863// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP278:![0-9]+]]11864// CHECK-32: omp.inner.for.end:11865// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]11866// CHECK-32: omp.dispatch.inc:11867// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]11868// CHECK-32: omp.dispatch.end:11869// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])11870// CHECK-32-NEXT: ret void11871//11872//11873// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l5511874// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {11875// CHECK-32-NEXT: entry:11876// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 411877// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 411878// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 411879// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 411880// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_kernel_environment, ptr [[DYN_PTR]])11881// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -111882// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]11883// CHECK-32: user_code.entry:11884// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])11885// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 411886// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 411887// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]11888// CHECK-32-NEXT: call void @__kmpc_target_deinit()11889// CHECK-32-NEXT: ret void11890// CHECK-32: worker.exit:11891// CHECK-32-NEXT: ret void11892//11893//11894// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined11895// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {11896// CHECK-32-NEXT: entry:11897// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411898// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411899// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411900// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411901// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 411902// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 411903// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411904// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411905// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411906// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 411907// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411908// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411909// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 411910// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 411911// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 411912// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 411913// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()11914// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 411915// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 411916// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])11917// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411918// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 911919// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]11920// CHECK-32: cond.true:11921// CHECK-32-NEXT: br label [[COND_END:%.*]]11922// CHECK-32: cond.false:11923// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411924// CHECK-32-NEXT: br label [[COND_END]]11925// CHECK-32: cond.end:11926// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]11927// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 411928// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411929// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 411930// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]11931// CHECK-32: omp.inner.for.cond:11932// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411933// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1011934// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]11935// CHECK-32: omp.inner.for.body:11936// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411937// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411938// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 011939// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr11940// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 411941// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 111942// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr11943// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 411944// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)11945// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]11946// CHECK-32: omp.inner.for.inc:11947// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 411948// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411949// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]11950// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 411951// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411952// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411953// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]11954// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 411955// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411956// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 411957// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]11958// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 411959// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411960// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 911961// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]11962// CHECK-32: cond.true5:11963// CHECK-32-NEXT: br label [[COND_END7:%.*]]11964// CHECK-32: cond.false6:11965// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 411966// CHECK-32-NEXT: br label [[COND_END7]]11967// CHECK-32: cond.end7:11968// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]11969// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 411970// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 411971// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 411972// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]11973// CHECK-32: omp.inner.for.end:11974// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]11975// CHECK-32: omp.loop.exit:11976// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])11977// CHECK-32-NEXT: ret void11978//11979//11980// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l55_omp_outlined_omp_outlined11981// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {11982// CHECK-32-NEXT: entry:11983// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 411984// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 411985// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 411986// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 411987// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 411988// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 411989// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 411990// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 411991// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 411992// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 411993// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 411994// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 411995// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 411996// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 411997// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 411998// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 411999// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 412000// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 412001// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 412002// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 412003// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 412004// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412005// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412006// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412007// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 412008// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412009// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 412010// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)12011// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]12012// CHECK-32: omp.dispatch.cond:12013// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])12014// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 012015// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]12016// CHECK-32: omp.dispatch.body:12017// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412018// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 412019// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12020// CHECK-32: omp.inner.for.cond:12021// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280:![0-9]+]]12022// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP280]]12023// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]12024// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12025// CHECK-32: omp.inner.for.body:12026// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280]]12027// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 112028// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]12029// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP280]]12030// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]12031// CHECK-32: omp.body.continue:12032// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12033// CHECK-32: omp.inner.for.inc:12034// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280]]12035// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 112036// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP280]]12037// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP281:![0-9]+]]12038// CHECK-32: omp.inner.for.end:12039// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]12040// CHECK-32: omp.dispatch.inc:12041// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]12042// CHECK-32: omp.dispatch.end:12043// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])12044// CHECK-32-NEXT: ret void12045//12046//12047// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l5812048// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {12049// CHECK-32-NEXT: entry:12050// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 412051// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412052// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 412053// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 412054// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_kernel_environment, ptr [[DYN_PTR]])12055// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -112056// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]12057// CHECK-32: user_code.entry:12058// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])12059// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412060// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 412061// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]12062// CHECK-32-NEXT: call void @__kmpc_target_deinit()12063// CHECK-32-NEXT: ret void12064// CHECK-32: worker.exit:12065// CHECK-32-NEXT: ret void12066//12067//12068// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined12069// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {12070// CHECK-32-NEXT: entry:12071// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412072// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412073// CHECK-32-NEXT: [[B:%.*]] = alloca i32, align 412074// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412075// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412076// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 412077// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 412078// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412079// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412080// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412081// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 412082// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412083// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412084// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 412085// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 412086// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412087// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412088// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()12089// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412090// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 412091// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])12092// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412093// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 912094// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]12095// CHECK-32: cond.true:12096// CHECK-32-NEXT: br label [[COND_END:%.*]]12097// CHECK-32: cond.false:12098// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412099// CHECK-32-NEXT: br label [[COND_END]]12100// CHECK-32: cond.end:12101// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]12102// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 412103// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 412104// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412105// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12106// CHECK-32: omp.inner.for.cond:12107// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283:![0-9]+]]12108// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1012109// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12110// CHECK-32: omp.inner.for.body:12111// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]12112// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]12113// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 012114// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr12115// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP283]]12116// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 112117// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr12118// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP283]]12119// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP283]]12120// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12121// CHECK-32: omp.inner.for.inc:12122// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283]]12123// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP283]]12124// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]12125// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283]]12126// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]12127// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP283]]12128// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]12129// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]12130// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]12131// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP283]]12132// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]12133// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]12134// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]12135// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 912136// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]12137// CHECK-32: cond.true5:12138// CHECK-32-NEXT: br label [[COND_END7:%.*]]12139// CHECK-32: cond.false6:12140// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]12141// CHECK-32-NEXT: br label [[COND_END7]]12142// CHECK-32: cond.end7:12143// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]12144// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP283]]12145// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP283]]12146// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP283]]12147// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP284:![0-9]+]]12148// CHECK-32: omp.inner.for.end:12149// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12150// CHECK-32: omp.loop.exit:12151// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])12152// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412153// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 012154// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12155// CHECK-32: .omp.final.then:12156// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412157// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12158// CHECK-32: .omp.final.done:12159// CHECK-32-NEXT: ret void12160//12161//12162// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l58_omp_outlined_omp_outlined12163// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {12164// CHECK-32-NEXT: entry:12165// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412166// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412167// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 412168// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 412169// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412170// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412171// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 412172// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 412173// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412174// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412175// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412176// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412177// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412178// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 412179// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 412180// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 412181// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 412182// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 412183// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 412184// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 412185// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 412186// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412187// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412188// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412189// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 412190// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)12191// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412192// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412193// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12194// CHECK-32: omp.inner.for.cond:12195// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286:![0-9]+]]12196// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4, !llvm.access.group [[ACC_GRP286]]12197// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]12198// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12199// CHECK-32: omp.inner.for.body:12200// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286]]12201// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 112202// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]12203// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP286]]12204// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]12205// CHECK-32: omp.body.continue:12206// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12207// CHECK-32: omp.inner.for.inc:12208// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286]]12209// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP286]]12210// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]12211// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP286]]12212// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP287:![0-9]+]]12213// CHECK-32: omp.inner.for.end:12214// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12215// CHECK-32: omp.loop.exit:12216// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])12217// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412218// CHECK-32-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 012219// CHECK-32-NEXT: br i1 [[TMP11]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12220// CHECK-32: .omp.final.then:12221// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412222// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12223// CHECK-32: .omp.final.done:12224// CHECK-32-NEXT: ret void12225//12226//12227// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l6612228// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {12229// CHECK-32-NEXT: entry:12230// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 412231// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412232// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 412233// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 412234// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_kernel_environment, ptr [[DYN_PTR]])12235// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -112236// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]12237// CHECK-32: user_code.entry:12238// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])12239// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412240// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 412241// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]12242// CHECK-32-NEXT: call void @__kmpc_target_deinit()12243// CHECK-32-NEXT: ret void12244// CHECK-32: worker.exit:12245// CHECK-32-NEXT: ret void12246//12247//12248// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined12249// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {12250// CHECK-32-NEXT: entry:12251// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412252// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412253// CHECK-32-NEXT: [[B:%.*]] = alloca [3 x i32], align 412254// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412255// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412256// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 412257// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 412258// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412259// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412260// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412261// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 412262// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412263// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412264// CHECK-32-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[B]], ptr align 4 @"__const.<captured>.b", i32 12, i1 false)12265// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 412266// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 412267// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412268// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412269// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()12270// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412271// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 412272// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])12273// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412274// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 912275// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]12276// CHECK-32: cond.true:12277// CHECK-32-NEXT: br label [[COND_END:%.*]]12278// CHECK-32: cond.false:12279// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412280// CHECK-32-NEXT: br label [[COND_END]]12281// CHECK-32: cond.end:12282// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]12283// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 412284// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 412285// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412286// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12287// CHECK-32: omp.inner.for.cond:12288// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289:![0-9]+]]12289// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1012290// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12291// CHECK-32: omp.inner.for.body:12292// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]12293// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]12294// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 012295// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr12296// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP289]]12297// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 112298// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr12299// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP289]]12300// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP289]]12301// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12302// CHECK-32: omp.inner.for.inc:12303// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289]]12304// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP289]]12305// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]12306// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289]]12307// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]12308// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP289]]12309// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]12310// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]12311// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]12312// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP289]]12313// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]12314// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]12315// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]12316// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 912317// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]12318// CHECK-32: cond.true5:12319// CHECK-32-NEXT: br label [[COND_END7:%.*]]12320// CHECK-32: cond.false6:12321// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]12322// CHECK-32-NEXT: br label [[COND_END7]]12323// CHECK-32: cond.end7:12324// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]12325// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP289]]12326// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP289]]12327// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP289]]12328// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP290:![0-9]+]]12329// CHECK-32: omp.inner.for.end:12330// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12331// CHECK-32: omp.loop.exit:12332// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])12333// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412334// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 012335// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12336// CHECK-32: .omp.final.then:12337// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412338// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12339// CHECK-32: .omp.final.done:12340// CHECK-32-NEXT: ret void12341//12342//12343// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l66_omp_outlined_omp_outlined12344// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {12345// CHECK-32-NEXT: entry:12346// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412347// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412348// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 412349// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 412350// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412351// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412352// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 412353// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 412354// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412355// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412356// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412357// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412358// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412359// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 412360// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 412361// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 412362// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 412363// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 412364// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 412365// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 412366// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 412367// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412368// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412369// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412370// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 412371// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)12372// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 412373// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 912374// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]12375// CHECK-32: cond.true:12376// CHECK-32-NEXT: br label [[COND_END:%.*]]12377// CHECK-32: cond.false:12378// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 412379// CHECK-32-NEXT: br label [[COND_END]]12380// CHECK-32: cond.end:12381// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]12382// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 412383// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412384// CHECK-32-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 412385// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12386// CHECK-32: omp.inner.for.cond:12387// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292:![0-9]+]]12388// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP292]]12389// CHECK-32-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]12390// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12391// CHECK-32: omp.inner.for.body:12392// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292]]12393// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 112394// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]12395// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP292]]12396// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]12397// CHECK-32: omp.body.continue:12398// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12399// CHECK-32: omp.inner.for.inc:12400// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292]]12401// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 112402// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP292]]12403// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP293:![0-9]+]]12404// CHECK-32: omp.inner.for.end:12405// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12406// CHECK-32: omp.loop.exit:12407// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])12408// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412409// CHECK-32-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 012410// CHECK-32-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12411// CHECK-32: .omp.final.then:12412// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412413// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12414// CHECK-32: .omp.final.done:12415// CHECK-32-NEXT: ret void12416//12417//12418// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l7312419// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {12420// CHECK-32-NEXT: entry:12421// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 412422// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412423// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 412424// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 412425// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_kernel_environment, ptr [[DYN_PTR]])12426// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -112427// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]12428// CHECK-32: user_code.entry:12429// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])12430// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412431// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 412432// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]12433// CHECK-32-NEXT: call void @__kmpc_target_deinit()12434// CHECK-32-NEXT: ret void12435// CHECK-32: worker.exit:12436// CHECK-32-NEXT: ret void12437//12438//12439// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined12440// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {12441// CHECK-32-NEXT: entry:12442// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412443// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412444// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412445// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412446// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 412447// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 412448// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412449// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412450// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412451// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 412452// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412453// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412454// CHECK-32-NEXT: [[C:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)12455// CHECK-32-NEXT: [[B:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)12456// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 412457// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 412458// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412459// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412460// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412461// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 412462// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)12463// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412464// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 912465// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]12466// CHECK-32: cond.true:12467// CHECK-32-NEXT: br label [[COND_END:%.*]]12468// CHECK-32: cond.false:12469// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412470// CHECK-32-NEXT: br label [[COND_END]]12471// CHECK-32: cond.end:12472// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]12473// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 412474// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 412475// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412476// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12477// CHECK-32: omp.inner.for.cond:12478// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP295:![0-9]+]]12479// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP295]]12480// CHECK-32-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]12481// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12482// CHECK-32: omp.inner.for.body:12483// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP295]]12484// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP295]]12485// CHECK-32-NEXT: [[TMP9:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 012486// CHECK-32-NEXT: [[TMP10:%.*]] = inttoptr i32 [[TMP7]] to ptr12487// CHECK-32-NEXT: store ptr [[TMP10]], ptr [[TMP9]], align 4, !llvm.access.group [[ACC_GRP295]]12488// CHECK-32-NEXT: [[TMP11:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 112489// CHECK-32-NEXT: [[TMP12:%.*]] = inttoptr i32 [[TMP8]] to ptr12490// CHECK-32-NEXT: store ptr [[TMP12]], ptr [[TMP11]], align 4, !llvm.access.group [[ACC_GRP295]]12491// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined_wrapper, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP295]]12492// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12493// CHECK-32: omp.inner.for.inc:12494// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP295]]12495// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP295]]12496// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP13]], [[TMP14]]12497// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP295]]12498// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP296:![0-9]+]]12499// CHECK-32: omp.inner.for.end:12500// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12501// CHECK-32: omp.loop.exit:12502// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])12503// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412504// CHECK-32-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 012505// CHECK-32-NEXT: br i1 [[TMP16]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12506// CHECK-32: .omp.final.then:12507// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412508// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12509// CHECK-32: .omp.final.done:12510// CHECK-32-NEXT: store ptr [[B]], ptr [[C]], align 412511// CHECK-32-NEXT: call void @__kmpc_free_shared(ptr [[B]], i32 4)12512// CHECK-32-NEXT: call void @__kmpc_free_shared(ptr [[C]], i32 4)12513// CHECK-32-NEXT: ret void12514//12515//12516// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined12517// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {12518// CHECK-32-NEXT: entry:12519// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412520// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412521// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 412522// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 412523// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412524// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412525// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 412526// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 412527// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412528// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412529// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412530// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412531// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412532// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 412533// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 412534// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 412535// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 412536// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 412537// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 412538// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 412539// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 412540// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412541// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412542// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412543// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 412544// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)12545// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412546// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412547// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12548// CHECK-32: omp.inner.for.cond:12549// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298:![0-9]+]]12550// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 4, !llvm.access.group [[ACC_GRP298]]12551// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]12552// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12553// CHECK-32: omp.inner.for.body:12554// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298]]12555// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 112556// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]12557// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP298]]12558// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]12559// CHECK-32: omp.body.continue:12560// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12561// CHECK-32: omp.inner.for.inc:12562// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298]]12563// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP298]]12564// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]12565// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP298]]12566// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP299:![0-9]+]]12567// CHECK-32: omp.inner.for.end:12568// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12569// CHECK-32: omp.loop.exit:12570// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])12571// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412572// CHECK-32-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 012573// CHECK-32-NEXT: br i1 [[TMP11]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12574// CHECK-32: .omp.final.then:12575// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412576// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12577// CHECK-32: .omp.final.done:12578// CHECK-32-NEXT: ret void12579//12580//12581// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined_wrapper12582// CHECK-32-SAME: (i16 noundef zeroext [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR7:[0-9]+]] {12583// CHECK-32-NEXT: entry:12584// CHECK-32-NEXT: [[DOTADDR:%.*]] = alloca i16, align 212585// CHECK-32-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 412586// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412587// CHECK-32-NEXT: [[GLOBAL_ARGS:%.*]] = alloca ptr, align 412588// CHECK-32-NEXT: store i16 [[TMP0]], ptr [[DOTADDR]], align 212589// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 412590// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412591// CHECK-32-NEXT: call void @__kmpc_get_shared_variables(ptr [[GLOBAL_ARGS]])12592// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[GLOBAL_ARGS]], align 412593// CHECK-32-NEXT: [[TMP3:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i32 012594// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 412595// CHECK-32-NEXT: [[TMP5:%.*]] = getelementptr inbounds ptr, ptr [[TMP2]], i32 112596// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 412597// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l73_omp_outlined_omp_outlined(ptr [[DOTADDR1]], ptr [[DOTZERO_ADDR]], i32 [[TMP4]], i32 [[TMP6]]) #[[ATTR2]]12598// CHECK-32-NEXT: ret void12599//12600//12601// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l8112602// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {12603// CHECK-32-NEXT: entry:12604// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 412605// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412606// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 412607// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 412608// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_kernel_environment, ptr [[DYN_PTR]])12609// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -112610// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]12611// CHECK-32: user_code.entry:12612// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])12613// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412614// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 412615// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]12616// CHECK-32-NEXT: call void @__kmpc_target_deinit()12617// CHECK-32-NEXT: ret void12618// CHECK-32: worker.exit:12619// CHECK-32-NEXT: ret void12620//12621//12622// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined12623// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {12624// CHECK-32-NEXT: entry:12625// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412626// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412627// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412628// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412629// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 412630// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 412631// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412632// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412633// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412634// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 412635// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412636// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412637// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 412638// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 412639// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412640// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412641// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()12642// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412643// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 412644// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])12645// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412646// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 912647// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]12648// CHECK-32: cond.true:12649// CHECK-32-NEXT: br label [[COND_END:%.*]]12650// CHECK-32: cond.false:12651// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412652// CHECK-32-NEXT: br label [[COND_END]]12653// CHECK-32: cond.end:12654// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]12655// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 412656// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 412657// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412658// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12659// CHECK-32: omp.inner.for.cond:12660// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301:![0-9]+]]12661// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1012662// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12663// CHECK-32: omp.inner.for.body:12664// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]12665// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]12666// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 012667// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr12668// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP301]]12669// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 112670// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr12671// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP301]]12672// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP301]]12673// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12674// CHECK-32: omp.inner.for.inc:12675// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301]]12676// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP301]]12677// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]12678// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301]]12679// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]12680// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP301]]12681// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]12682// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]12683// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]12684// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP301]]12685// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]12686// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]12687// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]12688// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 912689// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]12690// CHECK-32: cond.true5:12691// CHECK-32-NEXT: br label [[COND_END7:%.*]]12692// CHECK-32: cond.false6:12693// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]12694// CHECK-32-NEXT: br label [[COND_END7]]12695// CHECK-32: cond.end7:12696// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]12697// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP301]]12698// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP301]]12699// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP301]]12700// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP302:![0-9]+]]12701// CHECK-32: omp.inner.for.end:12702// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12703// CHECK-32: omp.loop.exit:12704// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])12705// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412706// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 012707// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12708// CHECK-32: .omp.final.then:12709// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412710// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12711// CHECK-32: .omp.final.done:12712// CHECK-32-NEXT: ret void12713//12714//12715// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l81_omp_outlined_omp_outlined12716// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {12717// CHECK-32-NEXT: entry:12718// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412719// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412720// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 412721// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 412722// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412723// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412724// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 412725// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 412726// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412727// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412728// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412729// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412730// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412731// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 412732// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 412733// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 412734// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 412735// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 412736// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 412737// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 412738// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 412739// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412740// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412741// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412742// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 412743// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412744// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 412745// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)12746// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]12747// CHECK-32: omp.dispatch.cond:12748// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])12749// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 012750// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]12751// CHECK-32: omp.dispatch.body:12752// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412753// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 412754// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12755// CHECK-32: omp.inner.for.cond:12756// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304:![0-9]+]]12757// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP304]]12758// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]12759// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12760// CHECK-32: omp.inner.for.body:12761// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304]]12762// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 112763// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]12764// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP304]]12765// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]12766// CHECK-32: omp.body.continue:12767// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12768// CHECK-32: omp.inner.for.inc:12769// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304]]12770// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 112771// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP304]]12772// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP305:![0-9]+]]12773// CHECK-32: omp.inner.for.end:12774// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]12775// CHECK-32: omp.dispatch.inc:12776// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]12777// CHECK-32: omp.dispatch.end:12778// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])12779// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412780// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 012781// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12782// CHECK-32: .omp.final.then:12783// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412784// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12785// CHECK-32: .omp.final.done:12786// CHECK-32-NEXT: ret void12787//12788//12789// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l8512790// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {12791// CHECK-32-NEXT: entry:12792// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 412793// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412794// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 412795// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 412796// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_kernel_environment, ptr [[DYN_PTR]])12797// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -112798// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]12799// CHECK-32: user_code.entry:12800// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])12801// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412802// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 412803// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]12804// CHECK-32-NEXT: call void @__kmpc_target_deinit()12805// CHECK-32-NEXT: ret void12806// CHECK-32: worker.exit:12807// CHECK-32-NEXT: ret void12808//12809//12810// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined12811// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {12812// CHECK-32-NEXT: entry:12813// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412814// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412815// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412816// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412817// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 412818// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 412819// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412820// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412821// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412822// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 412823// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412824// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412825// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 412826// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 412827// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412828// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412829// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()12830// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412831// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 412832// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])12833// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412834// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 912835// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]12836// CHECK-32: cond.true:12837// CHECK-32-NEXT: br label [[COND_END:%.*]]12838// CHECK-32: cond.false:12839// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 412840// CHECK-32-NEXT: br label [[COND_END]]12841// CHECK-32: cond.end:12842// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]12843// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 412844// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 412845// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 412846// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12847// CHECK-32: omp.inner.for.cond:12848// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307:![0-9]+]]12849// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1012850// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12851// CHECK-32: omp.inner.for.body:12852// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]12853// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]12854// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 012855// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr12856// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP307]]12857// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 112858// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr12859// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP307]]12860// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP307]]12861// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12862// CHECK-32: omp.inner.for.inc:12863// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307]]12864// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP307]]12865// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]12866// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307]]12867// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]12868// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP307]]12869// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]12870// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]12871// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]12872// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP307]]12873// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]12874// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]12875// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]12876// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 912877// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]12878// CHECK-32: cond.true5:12879// CHECK-32-NEXT: br label [[COND_END7:%.*]]12880// CHECK-32: cond.false6:12881// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]12882// CHECK-32-NEXT: br label [[COND_END7]]12883// CHECK-32: cond.end7:12884// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]12885// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP307]]12886// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP307]]12887// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP307]]12888// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP308:![0-9]+]]12889// CHECK-32: omp.inner.for.end:12890// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]12891// CHECK-32: omp.loop.exit:12892// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])12893// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412894// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 012895// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12896// CHECK-32: .omp.final.then:12897// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412898// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12899// CHECK-32: .omp.final.done:12900// CHECK-32-NEXT: ret void12901//12902//12903// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l85_omp_outlined_omp_outlined12904// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {12905// CHECK-32-NEXT: entry:12906// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 412907// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 412908// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 412909// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 412910// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 412911// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 412912// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 412913// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 412914// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 412915// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 412916// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 412917// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 412918// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 412919// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 412920// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 412921// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 412922// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 412923// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 412924// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 412925// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 412926// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 412927// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 412928// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 412929// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412930// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 412931// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 412932// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 412933// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)12934// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]12935// CHECK-32: omp.dispatch.cond:12936// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])12937// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 012938// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]12939// CHECK-32: omp.dispatch.body:12940// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 412941// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 412942// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]12943// CHECK-32: omp.inner.for.cond:12944// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310:![0-9]+]]12945// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP310]]12946// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]12947// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]12948// CHECK-32: omp.inner.for.body:12949// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310]]12950// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 112951// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]12952// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP310]]12953// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]12954// CHECK-32: omp.body.continue:12955// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]12956// CHECK-32: omp.inner.for.inc:12957// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310]]12958// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 112959// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP310]]12960// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP311:![0-9]+]]12961// CHECK-32: omp.inner.for.end:12962// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]12963// CHECK-32: omp.dispatch.inc:12964// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]12965// CHECK-32: omp.dispatch.end:12966// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])12967// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 412968// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 012969// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]12970// CHECK-32: .omp.final.then:12971// CHECK-32-NEXT: store i32 10, ptr [[I]], align 412972// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]12973// CHECK-32: .omp.final.done:12974// CHECK-32-NEXT: ret void12975//12976//12977// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l8912978// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {12979// CHECK-32-NEXT: entry:12980// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 412981// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 412982// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 412983// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 412984// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_kernel_environment, ptr [[DYN_PTR]])12985// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -112986// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]12987// CHECK-32: user_code.entry:12988// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])12989// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 412990// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 412991// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]12992// CHECK-32-NEXT: call void @__kmpc_target_deinit()12993// CHECK-32-NEXT: ret void12994// CHECK-32: worker.exit:12995// CHECK-32-NEXT: ret void12996//12997//12998// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined12999// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {13000// CHECK-32-NEXT: entry:13001// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413002// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413003// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413004// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413005// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 413006// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 413007// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413008// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413009// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413010// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 413011// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413012// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413013// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 413014// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 413015// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413016// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413017// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()13018// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413019// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 413020// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])13021// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413022// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 913023// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13024// CHECK-32: cond.true:13025// CHECK-32-NEXT: br label [[COND_END:%.*]]13026// CHECK-32: cond.false:13027// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413028// CHECK-32-NEXT: br label [[COND_END]]13029// CHECK-32: cond.end:13030// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]13031// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 413032// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413033// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413034// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13035// CHECK-32: omp.inner.for.cond:13036// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313:![0-9]+]]13037// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1013038// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13039// CHECK-32: omp.inner.for.body:13040// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]13041// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]13042// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 013043// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr13044// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP313]]13045// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 113046// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr13047// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP313]]13048// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP313]]13049// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13050// CHECK-32: omp.inner.for.inc:13051// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313]]13052// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP313]]13053// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]13054// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313]]13055// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]13056// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP313]]13057// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]13058// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]13059// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]13060// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP313]]13061// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]13062// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]13063// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]13064// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 913065// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]13066// CHECK-32: cond.true5:13067// CHECK-32-NEXT: br label [[COND_END7:%.*]]13068// CHECK-32: cond.false6:13069// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]13070// CHECK-32-NEXT: br label [[COND_END7]]13071// CHECK-32: cond.end7:13072// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]13073// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP313]]13074// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP313]]13075// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP313]]13076// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP314:![0-9]+]]13077// CHECK-32: omp.inner.for.end:13078// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13079// CHECK-32: omp.loop.exit:13080// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])13081// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 413082// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 013083// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]13084// CHECK-32: .omp.final.then:13085// CHECK-32-NEXT: store i32 10, ptr [[I]], align 413086// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]13087// CHECK-32: .omp.final.done:13088// CHECK-32-NEXT: ret void13089//13090//13091// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l89_omp_outlined_omp_outlined13092// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {13093// CHECK-32-NEXT: entry:13094// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413095// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413096// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 413097// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 413098// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413099// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413100// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 413101// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 413102// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413103// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413104// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413105// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413106// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413107// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 413108// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 413109// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 413110// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 413111// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 413112// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413113// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 413114// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 413115// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413116// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413117// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413118// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 413119// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413120// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 413121// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)13122// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]13123// CHECK-32: omp.dispatch.cond:13124// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])13125// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 013126// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]13127// CHECK-32: omp.dispatch.body:13128// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413129// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 413130// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13131// CHECK-32: omp.inner.for.cond:13132// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316:![0-9]+]]13133// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP316]]13134// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]13135// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13136// CHECK-32: omp.inner.for.body:13137// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316]]13138// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 113139// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]13140// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP316]]13141// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]13142// CHECK-32: omp.body.continue:13143// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13144// CHECK-32: omp.inner.for.inc:13145// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316]]13146// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 113147// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP316]]13148// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP317:![0-9]+]]13149// CHECK-32: omp.inner.for.end:13150// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]13151// CHECK-32: omp.dispatch.inc:13152// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]13153// CHECK-32: omp.dispatch.end:13154// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])13155// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 413156// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 013157// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]13158// CHECK-32: .omp.final.then:13159// CHECK-32-NEXT: store i32 10, ptr [[I]], align 413160// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]13161// CHECK-32: .omp.final.done:13162// CHECK-32-NEXT: ret void13163//13164//13165// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l9313166// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {13167// CHECK-32-NEXT: entry:13168// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 413169// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 413170// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 413171// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 413172// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_kernel_environment, ptr [[DYN_PTR]])13173// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -113174// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]13175// CHECK-32: user_code.entry:13176// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])13177// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 413178// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 413179// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]13180// CHECK-32-NEXT: call void @__kmpc_target_deinit()13181// CHECK-32-NEXT: ret void13182// CHECK-32: worker.exit:13183// CHECK-32-NEXT: ret void13184//13185//13186// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined13187// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {13188// CHECK-32-NEXT: entry:13189// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413190// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413191// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413192// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413193// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 413194// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 413195// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413196// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413197// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413198// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 413199// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413200// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413201// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 413202// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 413203// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413204// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413205// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()13206// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413207// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 413208// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])13209// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413210// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 913211// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13212// CHECK-32: cond.true:13213// CHECK-32-NEXT: br label [[COND_END:%.*]]13214// CHECK-32: cond.false:13215// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413216// CHECK-32-NEXT: br label [[COND_END]]13217// CHECK-32: cond.end:13218// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]13219// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 413220// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413221// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413222// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13223// CHECK-32: omp.inner.for.cond:13224// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319:![0-9]+]]13225// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1013226// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13227// CHECK-32: omp.inner.for.body:13228// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]13229// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]13230// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 013231// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr13232// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 4, !llvm.access.group [[ACC_GRP319]]13233// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 113234// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr13235// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 4, !llvm.access.group [[ACC_GRP319]]13236// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2), !llvm.access.group [[ACC_GRP319]]13237// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13238// CHECK-32: omp.inner.for.inc:13239// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319]]13240// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP319]]13241// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]13242// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319]]13243// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]13244// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP319]]13245// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]13246// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]13247// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]13248// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 4, !llvm.access.group [[ACC_GRP319]]13249// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]13250// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]13251// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]13252// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 913253// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]13254// CHECK-32: cond.true5:13255// CHECK-32-NEXT: br label [[COND_END7:%.*]]13256// CHECK-32: cond.false6:13257// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]13258// CHECK-32-NEXT: br label [[COND_END7]]13259// CHECK-32: cond.end7:13260// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]13261// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 4, !llvm.access.group [[ACC_GRP319]]13262// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4, !llvm.access.group [[ACC_GRP319]]13263// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP319]]13264// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP320:![0-9]+]]13265// CHECK-32: omp.inner.for.end:13266// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13267// CHECK-32: omp.loop.exit:13268// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])13269// CHECK-32-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 413270// CHECK-32-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 013271// CHECK-32-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]13272// CHECK-32: .omp.final.then:13273// CHECK-32-NEXT: store i32 10, ptr [[I]], align 413274// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]13275// CHECK-32: .omp.final.done:13276// CHECK-32-NEXT: ret void13277//13278//13279// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l93_omp_outlined_omp_outlined13280// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {13281// CHECK-32-NEXT: entry:13282// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413283// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413284// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 413285// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 413286// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413287// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413288// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 413289// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 413290// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413291// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413292// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413293// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413294// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413295// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 413296// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 413297// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 413298// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 413299// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 413300// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413301// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 413302// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 413303// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413304// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413305// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413306// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 413307// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413308// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 413309// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741860, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)13310// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]13311// CHECK-32: omp.dispatch.cond:13312// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])13313// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 013314// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]13315// CHECK-32: omp.dispatch.body:13316// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413317// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 413318// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13319// CHECK-32: omp.inner.for.cond:13320// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322:![0-9]+]]13321// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP322]]13322// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]13323// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13324// CHECK-32: omp.inner.for.body:13325// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322]]13326// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 113327// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]13328// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP322]]13329// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]13330// CHECK-32: omp.body.continue:13331// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13332// CHECK-32: omp.inner.for.inc:13333// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322]]13334// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 113335// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP322]]13336// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP323:![0-9]+]]13337// CHECK-32: omp.inner.for.end:13338// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]13339// CHECK-32: omp.dispatch.inc:13340// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]13341// CHECK-32: omp.dispatch.end:13342// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])13343// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 413344// CHECK-32-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 013345// CHECK-32-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]13346// CHECK-32: .omp.final.then:13347// CHECK-32-NEXT: store i32 10, ptr [[I]], align 413348// CHECK-32-NEXT: br label [[DOTOMP_FINAL_DONE]]13349// CHECK-32: .omp.final.done:13350// CHECK-32-NEXT: ret void13351//13352//13353// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l9713354// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {13355// CHECK-32-NEXT: entry:13356// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 413357// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 413358// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 413359// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 413360// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_kernel_environment, ptr [[DYN_PTR]])13361// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -113362// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]13363// CHECK-32: user_code.entry:13364// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])13365// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 413366// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 413367// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]13368// CHECK-32-NEXT: call void @__kmpc_target_deinit()13369// CHECK-32-NEXT: ret void13370// CHECK-32: worker.exit:13371// CHECK-32-NEXT: ret void13372//13373//13374// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined13375// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {13376// CHECK-32-NEXT: entry:13377// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413378// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413379// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413380// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413381// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 413382// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 413383// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413384// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413385// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413386// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 413387// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413388// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413389// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 413390// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 413391// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413392// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413393// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()13394// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413395// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 413396// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])13397// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413398// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 913399// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13400// CHECK-32: cond.true:13401// CHECK-32-NEXT: br label [[COND_END:%.*]]13402// CHECK-32: cond.false:13403// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413404// CHECK-32-NEXT: br label [[COND_END]]13405// CHECK-32: cond.end:13406// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]13407// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 413408// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413409// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413410// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13411// CHECK-32: omp.inner.for.cond:13412// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413413// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1013414// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13415// CHECK-32: omp.inner.for.body:13416// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413417// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413418// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 013419// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr13420// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 413421// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 113422// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr13423// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 413424// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)13425// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13426// CHECK-32: omp.inner.for.inc:13427// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413428// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413429// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]13430// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 413431// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413432// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413433// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]13434// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 413435// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413436// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413437// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]13438// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 413439// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413440// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 913441// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]13442// CHECK-32: cond.true5:13443// CHECK-32-NEXT: br label [[COND_END7:%.*]]13444// CHECK-32: cond.false6:13445// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413446// CHECK-32-NEXT: br label [[COND_END7]]13447// CHECK-32: cond.end7:13448// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]13449// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 413450// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413451// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 413452// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13453// CHECK-32: omp.inner.for.end:13454// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13455// CHECK-32: omp.loop.exit:13456// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])13457// CHECK-32-NEXT: ret void13458//13459//13460// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l97_omp_outlined_omp_outlined13461// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {13462// CHECK-32-NEXT: entry:13463// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413464// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413465// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 413466// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 413467// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413468// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413469// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 413470// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 413471// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413472// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413473// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413474// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413475// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413476// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 413477// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 413478// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 413479// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 413480// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 413481// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413482// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 413483// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 413484// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413485// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413486// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413487// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 413488// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)13489// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413490// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413491// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13492// CHECK-32: omp.inner.for.cond:13493// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413494// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413495// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]13496// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13497// CHECK-32: omp.inner.for.body:13498// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413499// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 113500// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]13501// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 413502// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]13503// CHECK-32: omp.body.continue:13504// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13505// CHECK-32: omp.inner.for.inc:13506// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413507// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413508// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]13509// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 413510// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13511// CHECK-32: omp.inner.for.end:13512// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13513// CHECK-32: omp.loop.exit:13514// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])13515// CHECK-32-NEXT: ret void13516//13517//13518// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l10113519// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {13520// CHECK-32-NEXT: entry:13521// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 413522// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 413523// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 413524// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 413525// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_kernel_environment, ptr [[DYN_PTR]])13526// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -113527// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]13528// CHECK-32: user_code.entry:13529// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])13530// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 413531// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 413532// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]13533// CHECK-32-NEXT: call void @__kmpc_target_deinit()13534// CHECK-32-NEXT: ret void13535// CHECK-32: worker.exit:13536// CHECK-32-NEXT: ret void13537//13538//13539// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined13540// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {13541// CHECK-32-NEXT: entry:13542// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413543// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413544// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413545// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413546// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 413547// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 413548// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413549// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413550// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413551// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 413552// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413553// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413554// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 413555// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 413556// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413557// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413558// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()13559// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413560// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 413561// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])13562// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413563// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 913564// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13565// CHECK-32: cond.true:13566// CHECK-32-NEXT: br label [[COND_END:%.*]]13567// CHECK-32: cond.false:13568// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413569// CHECK-32-NEXT: br label [[COND_END]]13570// CHECK-32: cond.end:13571// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]13572// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 413573// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413574// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413575// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13576// CHECK-32: omp.inner.for.cond:13577// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413578// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1013579// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13580// CHECK-32: omp.inner.for.body:13581// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413582// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413583// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 013584// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr13585// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 413586// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 113587// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr13588// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 413589// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)13590// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13591// CHECK-32: omp.inner.for.inc:13592// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413593// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413594// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]13595// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 413596// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413597// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413598// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]13599// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 413600// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413601// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413602// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]13603// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 413604// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413605// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 913606// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]13607// CHECK-32: cond.true5:13608// CHECK-32-NEXT: br label [[COND_END7:%.*]]13609// CHECK-32: cond.false6:13610// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413611// CHECK-32-NEXT: br label [[COND_END7]]13612// CHECK-32: cond.end7:13613// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]13614// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 413615// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413616// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 413617// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13618// CHECK-32: omp.inner.for.end:13619// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13620// CHECK-32: omp.loop.exit:13621// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])13622// CHECK-32-NEXT: ret void13623//13624//13625// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l101_omp_outlined_omp_outlined13626// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {13627// CHECK-32-NEXT: entry:13628// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413629// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413630// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 413631// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 413632// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413633// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413634// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 413635// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 413636// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413637// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413638// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413639// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413640// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413641// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 413642// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 413643// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 413644// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 413645// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 413646// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413647// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 413648// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 413649// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413650// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413651// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413652// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 413653// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)13654// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 413655// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP4]], 913656// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13657// CHECK-32: cond.true:13658// CHECK-32-NEXT: br label [[COND_END:%.*]]13659// CHECK-32: cond.false:13660// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 413661// CHECK-32-NEXT: br label [[COND_END]]13662// CHECK-32: cond.end:13663// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP5]], [[COND_FALSE]] ]13664// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 413665// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413666// CHECK-32-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 413667// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13668// CHECK-32: omp.inner.for.cond:13669// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413670// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 413671// CHECK-32-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]13672// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13673// CHECK-32: omp.inner.for.body:13674// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413675// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 113676// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]13677// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 413678// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]13679// CHECK-32: omp.body.continue:13680// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13681// CHECK-32: omp.inner.for.inc:13682// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413683// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 113684// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 413685// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13686// CHECK-32: omp.inner.for.end:13687// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13688// CHECK-32: omp.loop.exit:13689// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])13690// CHECK-32-NEXT: ret void13691//13692//13693// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l10513694// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {13695// CHECK-32-NEXT: entry:13696// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 413697// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 413698// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 413699// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 413700// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_kernel_environment, ptr [[DYN_PTR]])13701// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -113702// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]13703// CHECK-32: user_code.entry:13704// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])13705// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 413706// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 413707// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]13708// CHECK-32-NEXT: call void @__kmpc_target_deinit()13709// CHECK-32-NEXT: ret void13710// CHECK-32: worker.exit:13711// CHECK-32-NEXT: ret void13712//13713//13714// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined13715// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {13716// CHECK-32-NEXT: entry:13717// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413718// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413719// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413720// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413721// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 413722// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 413723// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413724// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413725// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413726// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 413727// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413728// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413729// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 413730// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 413731// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413732// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413733// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()13734// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413735// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 413736// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])13737// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413738// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 913739// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13740// CHECK-32: cond.true:13741// CHECK-32-NEXT: br label [[COND_END:%.*]]13742// CHECK-32: cond.false:13743// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413744// CHECK-32-NEXT: br label [[COND_END]]13745// CHECK-32: cond.end:13746// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]13747// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 413748// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413749// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413750// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13751// CHECK-32: omp.inner.for.cond:13752// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413753// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1013754// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13755// CHECK-32: omp.inner.for.body:13756// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413757// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413758// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 013759// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr13760// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 413761// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 113762// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr13763// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 413764// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)13765// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13766// CHECK-32: omp.inner.for.inc:13767// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413768// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413769// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]13770// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 413771// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413772// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413773// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]13774// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 413775// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413776// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413777// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]13778// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 413779// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413780// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 913781// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]13782// CHECK-32: cond.true5:13783// CHECK-32-NEXT: br label [[COND_END7:%.*]]13784// CHECK-32: cond.false6:13785// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413786// CHECK-32-NEXT: br label [[COND_END7]]13787// CHECK-32: cond.end7:13788// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]13789// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 413790// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413791// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 413792// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13793// CHECK-32: omp.inner.for.end:13794// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13795// CHECK-32: omp.loop.exit:13796// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])13797// CHECK-32-NEXT: ret void13798//13799//13800// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l105_omp_outlined_omp_outlined13801// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {13802// CHECK-32-NEXT: entry:13803// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413804// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413805// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 413806// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 413807// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413808// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413809// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 413810// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 413811// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413812// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413813// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413814// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413815// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413816// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 413817// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 413818// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 413819// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 413820// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 413821// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413822// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 413823// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 413824// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413825// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413826// CHECK-32-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413827// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 413828// CHECK-32-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB3]], i32 [[TMP3]], i32 33, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)13829// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413830// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413831// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13832// CHECK-32: omp.inner.for.cond:13833// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413834// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413835// CHECK-32-NEXT: [[CMP:%.*]] = icmp ule i32 [[TMP5]], [[TMP6]]13836// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13837// CHECK-32: omp.inner.for.body:13838// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413839// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 113840// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]13841// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 413842// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]13843// CHECK-32: omp.body.continue:13844// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13845// CHECK-32: omp.inner.for.inc:13846// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413847// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413848// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]13849// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 413850// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13851// CHECK-32: omp.inner.for.end:13852// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13853// CHECK-32: omp.loop.exit:13854// CHECK-32-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[TMP3]])13855// CHECK-32-NEXT: ret void13856//13857//13858// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l10913859// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {13860// CHECK-32-NEXT: entry:13861// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 413862// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 413863// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 413864// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 413865// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_kernel_environment, ptr [[DYN_PTR]])13866// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -113867// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]13868// CHECK-32: user_code.entry:13869// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])13870// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 413871// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 413872// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]13873// CHECK-32-NEXT: call void @__kmpc_target_deinit()13874// CHECK-32-NEXT: ret void13875// CHECK-32: worker.exit:13876// CHECK-32-NEXT: ret void13877//13878//13879// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined13880// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {13881// CHECK-32-NEXT: entry:13882// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413883// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413884// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413885// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413886// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 413887// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 413888// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413889// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413890// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413891// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 413892// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413893// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413894// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 413895// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 413896// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413897// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413898// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()13899// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413900// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 413901// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])13902// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413903// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 913904// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]13905// CHECK-32: cond.true:13906// CHECK-32-NEXT: br label [[COND_END:%.*]]13907// CHECK-32: cond.false:13908// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413909// CHECK-32-NEXT: br label [[COND_END]]13910// CHECK-32: cond.end:13911// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]13912// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 413913// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413914// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 413915// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]13916// CHECK-32: omp.inner.for.cond:13917// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413918// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1013919// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]13920// CHECK-32: omp.inner.for.body:13921// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413922// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413923// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 013924// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr13925// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 413926// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 113927// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr13928// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 413929// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)13930// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]13931// CHECK-32: omp.inner.for.inc:13932// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 413933// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413934// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]13935// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 413936// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413937// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413938// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]13939// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 413940// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413941// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 413942// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]13943// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 413944// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413945// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 913946// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]13947// CHECK-32: cond.true5:13948// CHECK-32-NEXT: br label [[COND_END7:%.*]]13949// CHECK-32: cond.false6:13950// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 413951// CHECK-32-NEXT: br label [[COND_END7]]13952// CHECK-32: cond.end7:13953// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]13954// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 413955// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 413956// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 413957// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]13958// CHECK-32: omp.inner.for.end:13959// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]13960// CHECK-32: omp.loop.exit:13961// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])13962// CHECK-32-NEXT: ret void13963//13964//13965// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l109_omp_outlined_omp_outlined13966// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {13967// CHECK-32-NEXT: entry:13968// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 413969// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 413970// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 413971// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 413972// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 413973// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 413974// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 413975// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 413976// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 413977// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 413978// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 413979// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 413980// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 413981// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 413982// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 413983// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 413984// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 413985// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 413986// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 413987// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 413988// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 413989// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 413990// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 413991// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 413992// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 413993// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 413994// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 413995// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741862, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)13996// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]13997// CHECK-32: omp.dispatch.cond:13998// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])13999// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 014000// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]14001// CHECK-32: omp.dispatch.body:14002// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 414003// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 414004// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]14005// CHECK-32: omp.inner.for.cond:14006// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325:![0-9]+]]14007// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP325]]14008// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]14009// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]14010// CHECK-32: omp.inner.for.body:14011// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325]]14012// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 114013// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]14014// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP325]]14015// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]14016// CHECK-32: omp.body.continue:14017// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]14018// CHECK-32: omp.inner.for.inc:14019// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325]]14020// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 114021// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP325]]14022// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP326:![0-9]+]]14023// CHECK-32: omp.inner.for.end:14024// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]14025// CHECK-32: omp.dispatch.inc:14026// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]14027// CHECK-32: omp.dispatch.end:14028// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])14029// CHECK-32-NEXT: ret void14030//14031//14032// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l11314033// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {14034// CHECK-32-NEXT: entry:14035// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 414036// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 414037// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 414038// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 414039// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_kernel_environment, ptr [[DYN_PTR]])14040// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -114041// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]14042// CHECK-32: user_code.entry:14043// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])14044// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 414045// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 414046// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]14047// CHECK-32-NEXT: call void @__kmpc_target_deinit()14048// CHECK-32-NEXT: ret void14049// CHECK-32: worker.exit:14050// CHECK-32-NEXT: ret void14051//14052//14053// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined14054// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {14055// CHECK-32-NEXT: entry:14056// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 414057// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 414058// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 414059// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 414060// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 414061// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 414062// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 414063// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 414064// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 414065// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 414066// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 414067// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 414068// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 414069// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 414070// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 414071// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 414072// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()14073// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 414074// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 414075// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])14076// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414077// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 914078// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]14079// CHECK-32: cond.true:14080// CHECK-32-NEXT: br label [[COND_END:%.*]]14081// CHECK-32: cond.false:14082// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414083// CHECK-32-NEXT: br label [[COND_END]]14084// CHECK-32: cond.end:14085// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]14086// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 414087// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414088// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 414089// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]14090// CHECK-32: omp.inner.for.cond:14091// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 414092// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1014093// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]14094// CHECK-32: omp.inner.for.body:14095// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414096// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414097// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 014098// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr14099// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 414100// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 114101// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr14102// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 414103// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)14104// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]14105// CHECK-32: omp.inner.for.inc:14106// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 414107// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414108// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]14109// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 414110// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414111// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414112// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]14113// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 414114// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414115// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414116// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]14117// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 414118// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414119// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 914120// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]14121// CHECK-32: cond.true5:14122// CHECK-32-NEXT: br label [[COND_END7:%.*]]14123// CHECK-32: cond.false6:14124// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414125// CHECK-32-NEXT: br label [[COND_END7]]14126// CHECK-32: cond.end7:14127// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]14128// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 414129// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414130// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 414131// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]14132// CHECK-32: omp.inner.for.end:14133// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]14134// CHECK-32: omp.loop.exit:14135// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])14136// CHECK-32-NEXT: ret void14137//14138//14139// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l113_omp_outlined_omp_outlined14140// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {14141// CHECK-32-NEXT: entry:14142// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 414143// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 414144// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 414145// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 414146// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 414147// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 414148// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 414149// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 414150// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 414151// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 414152// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 414153// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 414154// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 414155// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 414156// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 414157// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 414158// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 414159// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 414160// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 414161// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 414162// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 414163// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 414164// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 414165// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 414166// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 414167// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 414168// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 414169// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741861, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)14170// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]14171// CHECK-32: omp.dispatch.cond:14172// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])14173// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 014174// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]14175// CHECK-32: omp.dispatch.body:14176// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 414177// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 414178// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]14179// CHECK-32: omp.inner.for.cond:14180// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328:![0-9]+]]14181// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP328]]14182// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]14183// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]14184// CHECK-32: omp.inner.for.body:14185// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328]]14186// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 114187// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]14188// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP328]]14189// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]14190// CHECK-32: omp.body.continue:14191// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]14192// CHECK-32: omp.inner.for.inc:14193// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328]]14194// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 114195// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP328]]14196// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP329:![0-9]+]]14197// CHECK-32: omp.inner.for.end:14198// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]14199// CHECK-32: omp.dispatch.inc:14200// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]14201// CHECK-32: omp.dispatch.end:14202// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])14203// CHECK-32-NEXT: ret void14204//14205//14206// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l11714207// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {14208// CHECK-32-NEXT: entry:14209// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 414210// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 414211// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 414212// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 414213// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_kernel_environment, ptr [[DYN_PTR]])14214// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -114215// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]14216// CHECK-32: user_code.entry:14217// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])14218// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 414219// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 414220// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]14221// CHECK-32-NEXT: call void @__kmpc_target_deinit()14222// CHECK-32-NEXT: ret void14223// CHECK-32: worker.exit:14224// CHECK-32-NEXT: ret void14225//14226//14227// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined14228// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {14229// CHECK-32-NEXT: entry:14230// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 414231// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 414232// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 414233// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 414234// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 414235// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 414236// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 414237// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 414238// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 414239// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 414240// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 414241// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 414242// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 414243// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 414244// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 414245// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 414246// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()14247// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 414248// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 414249// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])14250// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414251// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 914252// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]14253// CHECK-32: cond.true:14254// CHECK-32-NEXT: br label [[COND_END:%.*]]14255// CHECK-32: cond.false:14256// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414257// CHECK-32-NEXT: br label [[COND_END]]14258// CHECK-32: cond.end:14259// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]14260// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 414261// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414262// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 414263// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]14264// CHECK-32: omp.inner.for.cond:14265// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 414266// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1014267// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]14268// CHECK-32: omp.inner.for.body:14269// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414270// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414271// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 014272// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr14273// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 414274// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 114275// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr14276// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 414277// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)14278// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]14279// CHECK-32: omp.inner.for.inc:14280// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 414281// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414282// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]14283// CHECK-32-NEXT: store i32 [[ADD]], ptr [[DOTOMP_IV]], align 414284// CHECK-32-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414285// CHECK-32-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414286// CHECK-32-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP14]], [[TMP15]]14287// CHECK-32-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_COMB_LB]], align 414288// CHECK-32-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414289// CHECK-32-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414290// CHECK-32-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]14291// CHECK-32-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_COMB_UB]], align 414292// CHECK-32-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414293// CHECK-32-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP18]], 914294// CHECK-32-NEXT: br i1 [[CMP4]], label [[COND_TRUE5:%.*]], label [[COND_FALSE6:%.*]]14295// CHECK-32: cond.true5:14296// CHECK-32-NEXT: br label [[COND_END7:%.*]]14297// CHECK-32: cond.false6:14298// CHECK-32-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414299// CHECK-32-NEXT: br label [[COND_END7]]14300// CHECK-32: cond.end7:14301// CHECK-32-NEXT: [[COND8:%.*]] = phi i32 [ 9, [[COND_TRUE5]] ], [ [[TMP19]], [[COND_FALSE6]] ]14302// CHECK-32-NEXT: store i32 [[COND8]], ptr [[DOTOMP_COMB_UB]], align 414303// CHECK-32-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414304// CHECK-32-NEXT: store i32 [[TMP20]], ptr [[DOTOMP_IV]], align 414305// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]]14306// CHECK-32: omp.inner.for.end:14307// CHECK-32-NEXT: br label [[OMP_LOOP_EXIT:%.*]]14308// CHECK-32: omp.loop.exit:14309// CHECK-32-NEXT: call void @__kmpc_distribute_static_fini(ptr @[[GLOB2]], i32 [[TMP1]])14310// CHECK-32-NEXT: ret void14311//14312//14313// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l117_omp_outlined_omp_outlined14314// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]]) #[[ATTR1]] {14315// CHECK-32-NEXT: entry:14316// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 414317// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 414318// CHECK-32-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 414319// CHECK-32-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 414320// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 414321// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 414322// CHECK-32-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 414323// CHECK-32-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 414324// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 414325// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 414326// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 414327// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 414328// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 414329// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_LB_]], ptr [[DOTPREVIOUS_LB__ADDR]], align 414330// CHECK-32-NEXT: store i32 [[DOTPREVIOUS_UB_]], ptr [[DOTPREVIOUS_UB__ADDR]], align 414331// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 414332// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 414333// CHECK-32-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTPREVIOUS_LB__ADDR]], align 414334// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTPREVIOUS_UB__ADDR]], align 414335// CHECK-32-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_LB]], align 414336// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_UB]], align 414337// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 414338// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 414339// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_LB]], align 414340// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 414341// CHECK-32-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 414342// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 414343// CHECK-32-NEXT: call void @__kmpc_dispatch_init_4(ptr @[[GLOB1]], i32 [[TMP5]], i32 1073741859, i32 [[TMP2]], i32 [[TMP3]], i32 1, i32 1)14344// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND:%.*]]14345// CHECK-32: omp.dispatch.cond:14346// CHECK-32-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_dispatch_next_4(ptr @[[GLOB1]], i32 [[TMP5]], ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]])14347// CHECK-32-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP6]], 014348// CHECK-32-NEXT: br i1 [[TOBOOL]], label [[OMP_DISPATCH_BODY:%.*]], label [[OMP_DISPATCH_END:%.*]]14349// CHECK-32: omp.dispatch.body:14350// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 414351// CHECK-32-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 414352// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]14353// CHECK-32: omp.inner.for.cond:14354// CHECK-32-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331:![0-9]+]]14355// CHECK-32-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP331]]14356// CHECK-32-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]14357// CHECK-32-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]14358// CHECK-32: omp.inner.for.body:14359// CHECK-32-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331]]14360// CHECK-32-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 114361// CHECK-32-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]14362// CHECK-32-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP331]]14363// CHECK-32-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]14364// CHECK-32: omp.body.continue:14365// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]14366// CHECK-32: omp.inner.for.inc:14367// CHECK-32-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331]]14368// CHECK-32-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP11]], 114369// CHECK-32-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP331]]14370// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP332:![0-9]+]]14371// CHECK-32: omp.inner.for.end:14372// CHECK-32-NEXT: br label [[OMP_DISPATCH_INC:%.*]]14373// CHECK-32: omp.dispatch.inc:14374// CHECK-32-NEXT: br label [[OMP_DISPATCH_COND]]14375// CHECK-32: omp.dispatch.end:14376// CHECK-32-NEXT: call void @__kmpc_dispatch_deinit(ptr @[[GLOB1]], i32 [[TMP5]])14377// CHECK-32-NEXT: ret void14378//14379//14380// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l12114381// CHECK-32-SAME: (ptr noalias noundef [[DYN_PTR:%.*]]) #[[ATTR0]] {14382// CHECK-32-NEXT: entry:14383// CHECK-32-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 414384// CHECK-32-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 414385// CHECK-32-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 414386// CHECK-32-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 414387// CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_kernel_environment, ptr [[DYN_PTR]])14388// CHECK-32-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -114389// CHECK-32-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]14390// CHECK-32: user_code.entry:14391// CHECK-32-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])14392// CHECK-32-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 414393// CHECK-32-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 414394// CHECK-32-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]]) #[[ATTR2]]14395// CHECK-32-NEXT: call void @__kmpc_target_deinit()14396// CHECK-32-NEXT: ret void14397// CHECK-32: worker.exit:14398// CHECK-32-NEXT: ret void14399//14400//14401// CHECK-32-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined14402// CHECK-32-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {14403// CHECK-32-NEXT: entry:14404// CHECK-32-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 414405// CHECK-32-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 414406// CHECK-32-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 414407// CHECK-32-NEXT: [[TMP:%.*]] = alloca i32, align 414408// CHECK-32-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 414409// CHECK-32-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 414410// CHECK-32-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 414411// CHECK-32-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 414412// CHECK-32-NEXT: [[I:%.*]] = alloca i32, align 414413// CHECK-32-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 414414// CHECK-32-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 414415// CHECK-32-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 414416// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_COMB_LB]], align 414417// CHECK-32-NEXT: store i32 9, ptr [[DOTOMP_COMB_UB]], align 414418// CHECK-32-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 414419// CHECK-32-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 414420// CHECK-32-NEXT: [[NVPTX_NUM_THREADS:%.*]] = call i32 @__kmpc_get_hardware_num_threads_in_block()14421// CHECK-32-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 414422// CHECK-32-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 414423// CHECK-32-NEXT: call void @__kmpc_distribute_static_init_4(ptr @[[GLOB2]], i32 [[TMP1]], i32 91, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 [[NVPTX_NUM_THREADS]])14424// CHECK-32-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414425// CHECK-32-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 914426// CHECK-32-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]14427// CHECK-32: cond.true:14428// CHECK-32-NEXT: br label [[COND_END:%.*]]14429// CHECK-32: cond.false:14430// CHECK-32-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414431// CHECK-32-NEXT: br label [[COND_END]]14432// CHECK-32: cond.end:14433// CHECK-32-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]14434// CHECK-32-NEXT: store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 414435// CHECK-32-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414436// CHECK-32-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 414437// CHECK-32-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]14438// CHECK-32: omp.inner.for.cond:14439// CHECK-32-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 414440// CHECK-32-NEXT: [[CMP1:%.*]] = icmp slt i32 [[TMP5]], 1014441// CHECK-32-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]14442// CHECK-32: omp.inner.for.body:14443// CHECK-32-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 414444// CHECK-32-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 414445// CHECK-32-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 014446// CHECK-32-NEXT: [[TMP9:%.*]] = inttoptr i32 [[TMP6]] to ptr14447// CHECK-32-NEXT: store ptr [[TMP9]], ptr [[TMP8]], align 414448// CHECK-32-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 114449// CHECK-32-NEXT: [[TMP11:%.*]] = inttoptr i32 [[TMP7]] to ptr14450// CHECK-32-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 414451// CHECK-32-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3foov_l121_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)14452// CHECK-32-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]14453// CHECK-32: omp.inner.for.inc:14454// CHECK-32-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 414455// CHECK-32-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_STRIDE]], align 414456//File truncated to the first 1 MiB.