5397 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// expected-no-diagnostics3#ifndef HEADER4#define HEADER5// Test host codegen.6// RUN: %clang_cc1 -DCK1 -verify -Wno-vla -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK17// RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s8// RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK19// RUN: %clang_cc1 -DCK1 -verify -Wno-vla -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK310// RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s11// RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK312 13// RUN: %clang_cc1 -DCK1 -verify -Wno-vla -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK514// RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s15// RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK516// RUN: %clang_cc1 -DCK1 -verify -Wno-vla -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK717// RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s18// RUN: %clang_cc1 -DCK1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK719#ifdef CK120 21int a[100];22 23int teams_argument_global(int n) {24 int i;25 int te = n / 128;26 int th = 128;27 // discard n_addr and i28 29 30 #pragma omp target31 #pragma omp teams distribute simd num_teams(te), thread_limit(th) aligned(a) simdlen(16) linear(i)32 for(i = 0; i < n; i++) {33 a[i] = 0;34 }35 36 #pragma omp target37 {{{38 #pragma omp teams distribute simd safelen(32)39 for(int i = 0; i < n; i++) {40 a[i] = 0;41 }42 }}}43 44 // outlined target regions45 46 47 48 49 return a[0];50}51 52 53#endif // CK154 55// Test host codegen.56// RUN: %clang_cc1 -DCK2 -verify -Wno-vla -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK957// RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s58// RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK959// RUN: %clang_cc1 -DCK2 -verify -Wno-vla -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1160// RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s61// RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1162 63// RUN: %clang_cc1 -DCK2 -verify -Wno-vla -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1364// RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s65// RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1366// RUN: %clang_cc1 -DCK2 -verify -Wno-vla -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1567// RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s68// RUN: %clang_cc1 -DCK2 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1569#ifdef CK270 71int teams_local_arg(void) {72 int n = 100;73 int a[n];74 75 #pragma omp target76 #pragma omp teams distribute simd77 for(int i = 0; i < n; i++) {78 a[i] = 0;79 }80 81 // outlined target region82 83 84 return a[0];85}86#endif // CK287 88// Test host codegen.89// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1790// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s91// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1792// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1993// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s94// RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK1995// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK2196// RUN: %clang_cc1 -DCK3 -fopenmp -DOMP5 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s97// RUN: %clang_cc1 -DCK3 -fopenmp -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2198// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK2399// RUN: %clang_cc1 -DCK3 -fopenmp -DOMP5 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s100// RUN: %clang_cc1 -DCK3 -fopenmp -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK23101 102// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK25103// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s104// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK25105// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK27106// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s107// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK27108// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp-simd -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK29109// RUN: %clang_cc1 -DCK3 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s110// RUN: %clang_cc1 -DCK3 -fopenmp-simd -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK29111// RUN: %clang_cc1 -DCK3 -verify -Wno-vla -fopenmp-simd -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK31112// RUN: %clang_cc1 -DCK3 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s113// RUN: %clang_cc1 -DCK3 -fopenmp-simd -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK31114#ifdef CK3115 116 117template <typename T, int X, long long Y>118struct SS{119 T a[X];120 float b;121 int foo(void) {122 123 #pragma omp target124#ifdef OMP5125 #pragma omp teams distribute simd if(b) nontemporal(a, b)126#else127 #pragma omp teams distribute simd128#endif // OMP5129 for(int i = 0; i < X; i++) {130 a[i] = (T)b;131 }132 133 // outlined target region134 135 136 return a[0];137 }138};139 140int teams_template_struct(void) {141 SS<int, 123, 456> V;142 return V.foo();143 144}145#endif // CK3146 147// Test host codegen.148// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK33149// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s150// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK33151// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK35152// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s153// RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK35154// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK37155// RUN: %clang_cc1 -DCK4 -fopenmp -DOMP5 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s156// RUN: %clang_cc1 -DCK4 -fopenmp -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK37157// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK39158// RUN: %clang_cc1 -DCK4 -fopenmp -DOMP5 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s159// RUN: %clang_cc1 -DCK4 -fopenmp -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK39160 161// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK41162// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s163// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK41164// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK43165// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s166// RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK43167// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp-simd -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK45168// RUN: %clang_cc1 -DCK4 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s169// RUN: %clang_cc1 -DCK4 -fopenmp-simd -DOMP5 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK45170// RUN: %clang_cc1 -DCK4 -verify -Wno-vla -fopenmp-simd -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK47171// RUN: %clang_cc1 -DCK4 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s172// RUN: %clang_cc1 -DCK4 -fopenmp-simd -DOMP5 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK47173 174#ifdef CK4175 176template <typename T, int n>177int tmain(T argc) {178 T a[n];179 int te = n/128;180 int th = 128;181#pragma omp target182#pragma omp teams distribute simd num_teams(te) thread_limit(th)183 for(int i = 0; i < n; i++) {184 a[i] = (T)0;185 }186 return 0;187}188 189int main (int argc, char **argv) {190 int n = 100;191 int a[n];192#pragma omp target193#ifdef OMP5194#pragma omp teams distribute simd if(simd:argc)195#else196#pragma omp teams distribute simd197#endif // OMP5198 for(int i = 0; i < n; i++) {199 a[i] = 0;200 }201 return tmain<int, 10>(argc);202}203 204 205 206 207 208 209 210// OMP5_50-DAG: !{!"llvm.loop.vectorize.enable", i1 false}211#endif // CK4212#endif213// CHECK1-LABEL: define {{[^@]+}}@_Z21teams_argument_globali214// CHECK1-SAME: (i32 noundef signext [[N:%.*]]) #[[ATTR0:[0-9]+]] {215// CHECK1-NEXT: entry:216// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4217// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4218// CHECK1-NEXT: [[TE:%.*]] = alloca i32, align 4219// CHECK1-NEXT: [[TH:%.*]] = alloca i32, align 4220// CHECK1-NEXT: [[TE_CASTED:%.*]] = alloca i64, align 8221// CHECK1-NEXT: [[TH_CASTED:%.*]] = alloca i64, align 8222// CHECK1-NEXT: [[I_CASTED:%.*]] = alloca i64, align 8223// CHECK1-NEXT: [[N_CASTED:%.*]] = alloca i64, align 8224// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [5 x ptr], align 8225// CHECK1-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [5 x ptr], align 8226// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [5 x ptr], align 8227// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4228// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4229// CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4230// CHECK1-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8231// CHECK1-NEXT: [[N_CASTED4:%.*]] = alloca i64, align 8232// CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [2 x ptr], align 8233// CHECK1-NEXT: [[DOTOFFLOAD_PTRS6:%.*]] = alloca [2 x ptr], align 8234// CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [2 x ptr], align 8235// CHECK1-NEXT: [[_TMP8:%.*]] = alloca i32, align 4236// CHECK1-NEXT: [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4237// CHECK1-NEXT: [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4238// CHECK1-NEXT: [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8239// CHECK1-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4240// CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[N_ADDR]], align 4241// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], 128242// CHECK1-NEXT: store i32 [[DIV]], ptr [[TE]], align 4243// CHECK1-NEXT: store i32 128, ptr [[TH]], align 4244// CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[TE]], align 4245// CHECK1-NEXT: store i32 [[TMP1]], ptr [[TE_CASTED]], align 4246// CHECK1-NEXT: [[TMP2:%.*]] = load i64, ptr [[TE_CASTED]], align 8247// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH]], align 4248// CHECK1-NEXT: store i32 [[TMP3]], ptr [[TH_CASTED]], align 4249// CHECK1-NEXT: [[TMP4:%.*]] = load i64, ptr [[TH_CASTED]], align 8250// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4251// CHECK1-NEXT: store i32 [[TMP5]], ptr [[I_CASTED]], align 4252// CHECK1-NEXT: [[TMP6:%.*]] = load i64, ptr [[I_CASTED]], align 8253// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[N_ADDR]], align 4254// CHECK1-NEXT: store i32 [[TMP7]], ptr [[N_CASTED]], align 4255// CHECK1-NEXT: [[TMP8:%.*]] = load i64, ptr [[N_CASTED]], align 8256// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0257// CHECK1-NEXT: store i64 [[TMP2]], ptr [[TMP9]], align 8258// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0259// CHECK1-NEXT: store i64 [[TMP2]], ptr [[TMP10]], align 8260// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0261// CHECK1-NEXT: store ptr null, ptr [[TMP11]], align 8262// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1263// CHECK1-NEXT: store i64 [[TMP4]], ptr [[TMP12]], align 8264// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1265// CHECK1-NEXT: store i64 [[TMP4]], ptr [[TMP13]], align 8266// CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1267// CHECK1-NEXT: store ptr null, ptr [[TMP14]], align 8268// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2269// CHECK1-NEXT: store ptr @a, ptr [[TMP15]], align 8270// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2271// CHECK1-NEXT: store ptr @a, ptr [[TMP16]], align 8272// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2273// CHECK1-NEXT: store ptr null, ptr [[TMP17]], align 8274// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3275// CHECK1-NEXT: store i64 [[TMP6]], ptr [[TMP18]], align 8276// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 3277// CHECK1-NEXT: store i64 [[TMP6]], ptr [[TMP19]], align 8278// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3279// CHECK1-NEXT: store ptr null, ptr [[TMP20]], align 8280// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4281// CHECK1-NEXT: store i64 [[TMP8]], ptr [[TMP21]], align 8282// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 4283// CHECK1-NEXT: store i64 [[TMP8]], ptr [[TMP22]], align 8284// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4285// CHECK1-NEXT: store ptr null, ptr [[TMP23]], align 8286// CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0287// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0288// CHECK1-NEXT: [[TMP26:%.*]] = load i32, ptr [[TE]], align 4289// CHECK1-NEXT: [[TMP27:%.*]] = load i32, ptr [[TH]], align 4290// CHECK1-NEXT: [[TMP28:%.*]] = icmp ult i32 [[TMP27]], 1291// CHECK1-NEXT: [[TMP29:%.*]] = select i1 [[TMP28]], i32 [[TMP27]], i32 1292// CHECK1-NEXT: [[TMP30:%.*]] = load i32, ptr [[N_ADDR]], align 4293// CHECK1-NEXT: store i32 [[TMP30]], ptr [[DOTCAPTURE_EXPR_]], align 4294// CHECK1-NEXT: [[TMP31:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4295// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP31]], 0296// CHECK1-NEXT: [[DIV2:%.*]] = sdiv i32 [[SUB]], 1297// CHECK1-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV2]], 1298// CHECK1-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_1]], align 4299// CHECK1-NEXT: [[TMP32:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4300// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP32]], 1301// CHECK1-NEXT: [[TMP33:%.*]] = zext i32 [[ADD]] to i64302// CHECK1-NEXT: [[TMP34:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP26]], 0303// CHECK1-NEXT: [[TMP35:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP29]], 0304// CHECK1-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0305// CHECK1-NEXT: store i32 3, ptr [[TMP36]], align 4306// CHECK1-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1307// CHECK1-NEXT: store i32 5, ptr [[TMP37]], align 4308// CHECK1-NEXT: [[TMP38:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2309// CHECK1-NEXT: store ptr [[TMP24]], ptr [[TMP38]], align 8310// CHECK1-NEXT: [[TMP39:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3311// CHECK1-NEXT: store ptr [[TMP25]], ptr [[TMP39]], align 8312// CHECK1-NEXT: [[TMP40:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4313// CHECK1-NEXT: store ptr @.offload_sizes, ptr [[TMP40]], align 8314// CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5315// CHECK1-NEXT: store ptr @.offload_maptypes, ptr [[TMP41]], align 8316// CHECK1-NEXT: [[TMP42:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6317// CHECK1-NEXT: store ptr null, ptr [[TMP42]], align 8318// CHECK1-NEXT: [[TMP43:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7319// CHECK1-NEXT: store ptr null, ptr [[TMP43]], align 8320// CHECK1-NEXT: [[TMP44:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8321// CHECK1-NEXT: store i64 [[TMP33]], ptr [[TMP44]], align 8322// CHECK1-NEXT: [[TMP45:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9323// CHECK1-NEXT: store i64 0, ptr [[TMP45]], align 8324// CHECK1-NEXT: [[TMP46:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10325// CHECK1-NEXT: store [3 x i32] [[TMP34]], ptr [[TMP46]], align 4326// CHECK1-NEXT: [[TMP47:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11327// CHECK1-NEXT: store [3 x i32] [[TMP35]], ptr [[TMP47]], align 4328// CHECK1-NEXT: [[TMP48:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12329// CHECK1-NEXT: store i32 0, ptr [[TMP48]], align 4330// CHECK1-NEXT: [[TMP49:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 [[TMP26]], i32 [[TMP29]], ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30.region_id, ptr [[KERNEL_ARGS]])331// CHECK1-NEXT: [[TMP50:%.*]] = icmp ne i32 [[TMP49]], 0332// CHECK1-NEXT: br i1 [[TMP50]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]333// CHECK1: omp_offload.failed:334// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30(i64 [[TMP2]], i64 [[TMP4]], ptr @a, i64 [[TMP6]], i64 [[TMP8]]) #[[ATTR3:[0-9]+]]335// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT]]336// CHECK1: omp_offload.cont:337// CHECK1-NEXT: [[TMP51:%.*]] = load i32, ptr [[N_ADDR]], align 4338// CHECK1-NEXT: store i32 [[TMP51]], ptr [[N_CASTED4]], align 4339// CHECK1-NEXT: [[TMP52:%.*]] = load i64, ptr [[N_CASTED4]], align 8340// CHECK1-NEXT: [[TMP53:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0341// CHECK1-NEXT: store i64 [[TMP52]], ptr [[TMP53]], align 8342// CHECK1-NEXT: [[TMP54:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS6]], i32 0, i32 0343// CHECK1-NEXT: store i64 [[TMP52]], ptr [[TMP54]], align 8344// CHECK1-NEXT: [[TMP55:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0345// CHECK1-NEXT: store ptr null, ptr [[TMP55]], align 8346// CHECK1-NEXT: [[TMP56:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1347// CHECK1-NEXT: store ptr @a, ptr [[TMP56]], align 8348// CHECK1-NEXT: [[TMP57:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS6]], i32 0, i32 1349// CHECK1-NEXT: store ptr @a, ptr [[TMP57]], align 8350// CHECK1-NEXT: [[TMP58:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 1351// CHECK1-NEXT: store ptr null, ptr [[TMP58]], align 8352// CHECK1-NEXT: [[TMP59:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0353// CHECK1-NEXT: [[TMP60:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS6]], i32 0, i32 0354// CHECK1-NEXT: [[TMP61:%.*]] = load i32, ptr [[N_ADDR]], align 4355// CHECK1-NEXT: store i32 [[TMP61]], ptr [[DOTCAPTURE_EXPR_9]], align 4356// CHECK1-NEXT: [[TMP62:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_9]], align 4357// CHECK1-NEXT: [[SUB11:%.*]] = sub nsw i32 [[TMP62]], 0358// CHECK1-NEXT: [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1359// CHECK1-NEXT: [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1360// CHECK1-NEXT: store i32 [[SUB13]], ptr [[DOTCAPTURE_EXPR_10]], align 4361// CHECK1-NEXT: [[TMP63:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_10]], align 4362// CHECK1-NEXT: [[ADD14:%.*]] = add nsw i32 [[TMP63]], 1363// CHECK1-NEXT: [[TMP64:%.*]] = zext i32 [[ADD14]] to i64364// CHECK1-NEXT: [[TMP65:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 0365// CHECK1-NEXT: store i32 3, ptr [[TMP65]], align 4366// CHECK1-NEXT: [[TMP66:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 1367// CHECK1-NEXT: store i32 2, ptr [[TMP66]], align 4368// CHECK1-NEXT: [[TMP67:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 2369// CHECK1-NEXT: store ptr [[TMP59]], ptr [[TMP67]], align 8370// CHECK1-NEXT: [[TMP68:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 3371// CHECK1-NEXT: store ptr [[TMP60]], ptr [[TMP68]], align 8372// CHECK1-NEXT: [[TMP69:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 4373// CHECK1-NEXT: store ptr @.offload_sizes.1, ptr [[TMP69]], align 8374// CHECK1-NEXT: [[TMP70:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 5375// CHECK1-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP70]], align 8376// CHECK1-NEXT: [[TMP71:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 6377// CHECK1-NEXT: store ptr null, ptr [[TMP71]], align 8378// CHECK1-NEXT: [[TMP72:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 7379// CHECK1-NEXT: store ptr null, ptr [[TMP72]], align 8380// CHECK1-NEXT: [[TMP73:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 8381// CHECK1-NEXT: store i64 [[TMP64]], ptr [[TMP73]], align 8382// CHECK1-NEXT: [[TMP74:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 9383// CHECK1-NEXT: store i64 0, ptr [[TMP74]], align 8384// CHECK1-NEXT: [[TMP75:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 10385// CHECK1-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP75]], align 4386// CHECK1-NEXT: [[TMP76:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 11387// CHECK1-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP76]], align 4388// CHECK1-NEXT: [[TMP77:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 12389// CHECK1-NEXT: store i32 0, ptr [[TMP77]], align 4390// CHECK1-NEXT: [[TMP78:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36.region_id, ptr [[KERNEL_ARGS15]])391// CHECK1-NEXT: [[TMP79:%.*]] = icmp ne i32 [[TMP78]], 0392// CHECK1-NEXT: br i1 [[TMP79]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]393// CHECK1: omp_offload.failed16:394// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36(i64 [[TMP52]], ptr @a) #[[ATTR3]]395// CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT17]]396// CHECK1: omp_offload.cont17:397// CHECK1-NEXT: [[TMP80:%.*]] = load i32, ptr @a, align 4398// CHECK1-NEXT: ret i32 [[TMP80]]399//400//401// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30402// CHECK1-SAME: (i64 noundef [[TE:%.*]], i64 noundef [[TH:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]], i64 noundef [[I:%.*]], i64 noundef [[N:%.*]]) #[[ATTR1:[0-9]+]] {403// CHECK1-NEXT: entry:404// CHECK1-NEXT: [[TE_ADDR:%.*]] = alloca i64, align 8405// CHECK1-NEXT: [[TH_ADDR:%.*]] = alloca i64, align 8406// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8407// CHECK1-NEXT: [[I_ADDR:%.*]] = alloca i64, align 8408// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i64, align 8409// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])410// CHECK1-NEXT: store i64 [[TE]], ptr [[TE_ADDR]], align 8411// CHECK1-NEXT: store i64 [[TH]], ptr [[TH_ADDR]], align 8412// CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8413// CHECK1-NEXT: store i64 [[I]], ptr [[I_ADDR]], align 8414// CHECK1-NEXT: store i64 [[N]], ptr [[N_ADDR]], align 8415// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8416// CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_ADDR]], align 4417// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_ADDR]], align 4418// CHECK1-NEXT: call void @__kmpc_push_num_teams(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP2]], i32 [[TMP3]])419// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30.omp_outlined, ptr [[I_ADDR]], ptr [[N_ADDR]], ptr [[TMP1]])420// CHECK1-NEXT: ret void421//422//423// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30.omp_outlined424// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[I:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]]) #[[ATTR1]] {425// CHECK1-NEXT: entry:426// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8427// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8428// CHECK1-NEXT: [[I_ADDR:%.*]] = alloca ptr, align 8429// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8430// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8431// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4432// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4433// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4434// CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4435// CHECK1-NEXT: [[I3:%.*]] = alloca i32, align 4436// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4437// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4438// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4439// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4440// CHECK1-NEXT: [[I4:%.*]] = alloca i32, align 4441// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8442// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8443// CHECK1-NEXT: store ptr [[I]], ptr [[I_ADDR]], align 8444// CHECK1-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8445// CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8446// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[I_ADDR]], align 8447// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[N_ADDR]], align 8448// CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 8449// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP1]], align 4450// CHECK1-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4451// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4452// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0453// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1454// CHECK1-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1455// CHECK1-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4456// CHECK1-NEXT: store i32 0, ptr [[I3]], align 4457// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4458// CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]459// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]460// CHECK1: omp.precond.then:461// CHECK1-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [100 x i32], ptr [[TMP2]], i64 0, i64 0462// CHECK1-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[ARRAYDECAY]], i64 16) ]463// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4464// CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4465// CHECK1-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4466// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4467// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4468// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8469// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4470// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)471// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4472// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4473// CHECK1-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]474// CHECK1-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]475// CHECK1: cond.true:476// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4477// CHECK1-NEXT: br label [[COND_END:%.*]]478// CHECK1: cond.false:479// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4480// CHECK1-NEXT: br label [[COND_END]]481// CHECK1: cond.end:482// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]483// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4484// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4485// CHECK1-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4486// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]487// CHECK1: omp.inner.for.cond:488// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5:![0-9]+]]489// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP5]]490// CHECK1-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]491// CHECK1-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]492// CHECK1: omp.inner.for.body:493// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]494// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 1495// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]496// CHECK1-NEXT: store i32 [[ADD]], ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP5]]497// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP5]]498// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i64499// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr [[TMP2]], i64 0, i64 [[IDXPROM]]500// CHECK1-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP5]]501// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]502// CHECK1: omp.body.continue:503// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]504// CHECK1: omp.inner.for.inc:505// CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]506// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP18]], 1507// CHECK1-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]508// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]509// CHECK1: omp.inner.for.end:510// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]511// CHECK1: omp.loop.exit:512// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8513// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4514// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])515// CHECK1-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4516// CHECK1-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0517// CHECK1-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]518// CHECK1: .omp.final.then:519// CHECK1-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4520// CHECK1-NEXT: [[SUB8:%.*]] = sub nsw i32 [[TMP23]], 0521// CHECK1-NEXT: [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1522// CHECK1-NEXT: [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1523// CHECK1-NEXT: [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]524// CHECK1-NEXT: store i32 [[ADD11]], ptr [[TMP0]], align 4525// CHECK1-NEXT: br label [[DOTOMP_FINAL_DONE]]526// CHECK1: .omp.final.done:527// CHECK1-NEXT: br label [[OMP_PRECOND_END]]528// CHECK1: omp.precond.end:529// CHECK1-NEXT: ret void530//531//532// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36533// CHECK1-SAME: (i64 noundef [[N:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]]) #[[ATTR1]] {534// CHECK1-NEXT: entry:535// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca i64, align 8536// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8537// CHECK1-NEXT: store i64 [[N]], ptr [[N_ADDR]], align 8538// CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8539// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8540// CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36.omp_outlined, ptr [[N_ADDR]], ptr [[TMP0]])541// CHECK1-NEXT: ret void542//543//544// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36.omp_outlined545// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]]) #[[ATTR1]] {546// CHECK1-NEXT: entry:547// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8548// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8549// CHECK1-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8550// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8551// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4552// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4553// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4554// CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4555// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4556// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4557// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4558// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4559// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4560// CHECK1-NEXT: [[I3:%.*]] = alloca i32, align 4561// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8562// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8563// CHECK1-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8564// CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8565// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8566// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8567// CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4568// CHECK1-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_]], align 4569// CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4570// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0571// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1572// CHECK1-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1573// CHECK1-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4574// CHECK1-NEXT: store i32 0, ptr [[I]], align 4575// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4576// CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]577// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]578// CHECK1: omp.precond.then:579// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4580// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4581// CHECK1-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 4582// CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4583// CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4584// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8585// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4586// CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)587// CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4588// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4589// CHECK1-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]590// CHECK1-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]591// CHECK1: cond.true:592// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4593// CHECK1-NEXT: br label [[COND_END:%.*]]594// CHECK1: cond.false:595// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4596// CHECK1-NEXT: br label [[COND_END]]597// CHECK1: cond.end:598// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]599// CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4600// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4601// CHECK1-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 4602// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]603// CHECK1: omp.inner.for.cond:604// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4605// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4606// CHECK1-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]607// CHECK1-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]608// CHECK1: omp.inner.for.body:609// CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4610// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1611// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]612// CHECK1-NEXT: store i32 [[ADD]], ptr [[I3]], align 4613// CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[I3]], align 4614// CHECK1-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP16]] to i64615// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr [[TMP1]], i64 0, i64 [[IDXPROM]]616// CHECK1-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4617// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]618// CHECK1: omp.body.continue:619// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]620// CHECK1: omp.inner.for.inc:621// CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4622// CHECK1-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP17]], 1623// CHECK1-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4624// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]]625// CHECK1: omp.inner.for.end:626// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]627// CHECK1: omp.loop.exit:628// CHECK1-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8629// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 4630// CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])631// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4632// CHECK1-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0633// CHECK1-NEXT: br i1 [[TMP21]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]634// CHECK1: .omp.final.then:635// CHECK1-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4636// CHECK1-NEXT: [[SUB7:%.*]] = sub nsw i32 [[TMP22]], 0637// CHECK1-NEXT: [[DIV8:%.*]] = sdiv i32 [[SUB7]], 1638// CHECK1-NEXT: [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 1639// CHECK1-NEXT: [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]640// CHECK1-NEXT: store i32 [[ADD10]], ptr [[I3]], align 4641// CHECK1-NEXT: br label [[DOTOMP_FINAL_DONE]]642// CHECK1: .omp.final.done:643// CHECK1-NEXT: br label [[OMP_PRECOND_END]]644// CHECK1: omp.precond.end:645// CHECK1-NEXT: ret void646//647//648// CHECK3-LABEL: define {{[^@]+}}@_Z21teams_argument_globali649// CHECK3-SAME: (i32 noundef [[N:%.*]]) #[[ATTR0:[0-9]+]] {650// CHECK3-NEXT: entry:651// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4652// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4653// CHECK3-NEXT: [[TE:%.*]] = alloca i32, align 4654// CHECK3-NEXT: [[TH:%.*]] = alloca i32, align 4655// CHECK3-NEXT: [[TE_CASTED:%.*]] = alloca i32, align 4656// CHECK3-NEXT: [[TH_CASTED:%.*]] = alloca i32, align 4657// CHECK3-NEXT: [[I_CASTED:%.*]] = alloca i32, align 4658// CHECK3-NEXT: [[N_CASTED:%.*]] = alloca i32, align 4659// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [5 x ptr], align 4660// CHECK3-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [5 x ptr], align 4661// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [5 x ptr], align 4662// CHECK3-NEXT: [[TMP:%.*]] = alloca i32, align 4663// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4664// CHECK3-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4665// CHECK3-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8666// CHECK3-NEXT: [[N_CASTED4:%.*]] = alloca i32, align 4667// CHECK3-NEXT: [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [2 x ptr], align 4668// CHECK3-NEXT: [[DOTOFFLOAD_PTRS6:%.*]] = alloca [2 x ptr], align 4669// CHECK3-NEXT: [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [2 x ptr], align 4670// CHECK3-NEXT: [[_TMP8:%.*]] = alloca i32, align 4671// CHECK3-NEXT: [[DOTCAPTURE_EXPR_9:%.*]] = alloca i32, align 4672// CHECK3-NEXT: [[DOTCAPTURE_EXPR_10:%.*]] = alloca i32, align 4673// CHECK3-NEXT: [[KERNEL_ARGS15:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8674// CHECK3-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4675// CHECK3-NEXT: [[TMP0:%.*]] = load i32, ptr [[N_ADDR]], align 4676// CHECK3-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], 128677// CHECK3-NEXT: store i32 [[DIV]], ptr [[TE]], align 4678// CHECK3-NEXT: store i32 128, ptr [[TH]], align 4679// CHECK3-NEXT: [[TMP1:%.*]] = load i32, ptr [[TE]], align 4680// CHECK3-NEXT: store i32 [[TMP1]], ptr [[TE_CASTED]], align 4681// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_CASTED]], align 4682// CHECK3-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH]], align 4683// CHECK3-NEXT: store i32 [[TMP3]], ptr [[TH_CASTED]], align 4684// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[TH_CASTED]], align 4685// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4686// CHECK3-NEXT: store i32 [[TMP5]], ptr [[I_CASTED]], align 4687// CHECK3-NEXT: [[TMP6:%.*]] = load i32, ptr [[I_CASTED]], align 4688// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[N_ADDR]], align 4689// CHECK3-NEXT: store i32 [[TMP7]], ptr [[N_CASTED]], align 4690// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[N_CASTED]], align 4691// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0692// CHECK3-NEXT: store i32 [[TMP2]], ptr [[TMP9]], align 4693// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0694// CHECK3-NEXT: store i32 [[TMP2]], ptr [[TMP10]], align 4695// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0696// CHECK3-NEXT: store ptr null, ptr [[TMP11]], align 4697// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1698// CHECK3-NEXT: store i32 [[TMP4]], ptr [[TMP12]], align 4699// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 1700// CHECK3-NEXT: store i32 [[TMP4]], ptr [[TMP13]], align 4701// CHECK3-NEXT: [[TMP14:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1702// CHECK3-NEXT: store ptr null, ptr [[TMP14]], align 4703// CHECK3-NEXT: [[TMP15:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2704// CHECK3-NEXT: store ptr @a, ptr [[TMP15]], align 4705// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 2706// CHECK3-NEXT: store ptr @a, ptr [[TMP16]], align 4707// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2708// CHECK3-NEXT: store ptr null, ptr [[TMP17]], align 4709// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3710// CHECK3-NEXT: store i32 [[TMP6]], ptr [[TMP18]], align 4711// CHECK3-NEXT: [[TMP19:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 3712// CHECK3-NEXT: store i32 [[TMP6]], ptr [[TMP19]], align 4713// CHECK3-NEXT: [[TMP20:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3714// CHECK3-NEXT: store ptr null, ptr [[TMP20]], align 4715// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4716// CHECK3-NEXT: store i32 [[TMP8]], ptr [[TMP21]], align 4717// CHECK3-NEXT: [[TMP22:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 4718// CHECK3-NEXT: store i32 [[TMP8]], ptr [[TMP22]], align 4719// CHECK3-NEXT: [[TMP23:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 4720// CHECK3-NEXT: store ptr null, ptr [[TMP23]], align 4721// CHECK3-NEXT: [[TMP24:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0722// CHECK3-NEXT: [[TMP25:%.*]] = getelementptr inbounds [5 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0723// CHECK3-NEXT: [[TMP26:%.*]] = load i32, ptr [[TE]], align 4724// CHECK3-NEXT: [[TMP27:%.*]] = load i32, ptr [[TH]], align 4725// CHECK3-NEXT: [[TMP28:%.*]] = icmp ult i32 [[TMP27]], 1726// CHECK3-NEXT: [[TMP29:%.*]] = select i1 [[TMP28]], i32 [[TMP27]], i32 1727// CHECK3-NEXT: [[TMP30:%.*]] = load i32, ptr [[N_ADDR]], align 4728// CHECK3-NEXT: store i32 [[TMP30]], ptr [[DOTCAPTURE_EXPR_]], align 4729// CHECK3-NEXT: [[TMP31:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4730// CHECK3-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP31]], 0731// CHECK3-NEXT: [[DIV2:%.*]] = sdiv i32 [[SUB]], 1732// CHECK3-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV2]], 1733// CHECK3-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_1]], align 4734// CHECK3-NEXT: [[TMP32:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4735// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP32]], 1736// CHECK3-NEXT: [[TMP33:%.*]] = zext i32 [[ADD]] to i64737// CHECK3-NEXT: [[TMP34:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP26]], 0738// CHECK3-NEXT: [[TMP35:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP29]], 0739// CHECK3-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0740// CHECK3-NEXT: store i32 3, ptr [[TMP36]], align 4741// CHECK3-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1742// CHECK3-NEXT: store i32 5, ptr [[TMP37]], align 4743// CHECK3-NEXT: [[TMP38:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2744// CHECK3-NEXT: store ptr [[TMP24]], ptr [[TMP38]], align 4745// CHECK3-NEXT: [[TMP39:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3746// CHECK3-NEXT: store ptr [[TMP25]], ptr [[TMP39]], align 4747// CHECK3-NEXT: [[TMP40:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4748// CHECK3-NEXT: store ptr @.offload_sizes, ptr [[TMP40]], align 4749// CHECK3-NEXT: [[TMP41:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5750// CHECK3-NEXT: store ptr @.offload_maptypes, ptr [[TMP41]], align 4751// CHECK3-NEXT: [[TMP42:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6752// CHECK3-NEXT: store ptr null, ptr [[TMP42]], align 4753// CHECK3-NEXT: [[TMP43:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7754// CHECK3-NEXT: store ptr null, ptr [[TMP43]], align 4755// CHECK3-NEXT: [[TMP44:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8756// CHECK3-NEXT: store i64 [[TMP33]], ptr [[TMP44]], align 8757// CHECK3-NEXT: [[TMP45:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9758// CHECK3-NEXT: store i64 0, ptr [[TMP45]], align 8759// CHECK3-NEXT: [[TMP46:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10760// CHECK3-NEXT: store [3 x i32] [[TMP34]], ptr [[TMP46]], align 4761// CHECK3-NEXT: [[TMP47:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11762// CHECK3-NEXT: store [3 x i32] [[TMP35]], ptr [[TMP47]], align 4763// CHECK3-NEXT: [[TMP48:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12764// CHECK3-NEXT: store i32 0, ptr [[TMP48]], align 4765// CHECK3-NEXT: [[TMP49:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 [[TMP26]], i32 [[TMP29]], ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30.region_id, ptr [[KERNEL_ARGS]])766// CHECK3-NEXT: [[TMP50:%.*]] = icmp ne i32 [[TMP49]], 0767// CHECK3-NEXT: br i1 [[TMP50]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]768// CHECK3: omp_offload.failed:769// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30(i32 [[TMP2]], i32 [[TMP4]], ptr @a, i32 [[TMP6]], i32 [[TMP8]]) #[[ATTR3:[0-9]+]]770// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT]]771// CHECK3: omp_offload.cont:772// CHECK3-NEXT: [[TMP51:%.*]] = load i32, ptr [[N_ADDR]], align 4773// CHECK3-NEXT: store i32 [[TMP51]], ptr [[N_CASTED4]], align 4774// CHECK3-NEXT: [[TMP52:%.*]] = load i32, ptr [[N_CASTED4]], align 4775// CHECK3-NEXT: [[TMP53:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0776// CHECK3-NEXT: store i32 [[TMP52]], ptr [[TMP53]], align 4777// CHECK3-NEXT: [[TMP54:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS6]], i32 0, i32 0778// CHECK3-NEXT: store i32 [[TMP52]], ptr [[TMP54]], align 4779// CHECK3-NEXT: [[TMP55:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 0780// CHECK3-NEXT: store ptr null, ptr [[TMP55]], align 4781// CHECK3-NEXT: [[TMP56:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 1782// CHECK3-NEXT: store ptr @a, ptr [[TMP56]], align 4783// CHECK3-NEXT: [[TMP57:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS6]], i32 0, i32 1784// CHECK3-NEXT: store ptr @a, ptr [[TMP57]], align 4785// CHECK3-NEXT: [[TMP58:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 1786// CHECK3-NEXT: store ptr null, ptr [[TMP58]], align 4787// CHECK3-NEXT: [[TMP59:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0788// CHECK3-NEXT: [[TMP60:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOFFLOAD_PTRS6]], i32 0, i32 0789// CHECK3-NEXT: [[TMP61:%.*]] = load i32, ptr [[N_ADDR]], align 4790// CHECK3-NEXT: store i32 [[TMP61]], ptr [[DOTCAPTURE_EXPR_9]], align 4791// CHECK3-NEXT: [[TMP62:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_9]], align 4792// CHECK3-NEXT: [[SUB11:%.*]] = sub nsw i32 [[TMP62]], 0793// CHECK3-NEXT: [[DIV12:%.*]] = sdiv i32 [[SUB11]], 1794// CHECK3-NEXT: [[SUB13:%.*]] = sub nsw i32 [[DIV12]], 1795// CHECK3-NEXT: store i32 [[SUB13]], ptr [[DOTCAPTURE_EXPR_10]], align 4796// CHECK3-NEXT: [[TMP63:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_10]], align 4797// CHECK3-NEXT: [[ADD14:%.*]] = add nsw i32 [[TMP63]], 1798// CHECK3-NEXT: [[TMP64:%.*]] = zext i32 [[ADD14]] to i64799// CHECK3-NEXT: [[TMP65:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 0800// CHECK3-NEXT: store i32 3, ptr [[TMP65]], align 4801// CHECK3-NEXT: [[TMP66:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 1802// CHECK3-NEXT: store i32 2, ptr [[TMP66]], align 4803// CHECK3-NEXT: [[TMP67:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 2804// CHECK3-NEXT: store ptr [[TMP59]], ptr [[TMP67]], align 4805// CHECK3-NEXT: [[TMP68:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 3806// CHECK3-NEXT: store ptr [[TMP60]], ptr [[TMP68]], align 4807// CHECK3-NEXT: [[TMP69:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 4808// CHECK3-NEXT: store ptr @.offload_sizes.1, ptr [[TMP69]], align 4809// CHECK3-NEXT: [[TMP70:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 5810// CHECK3-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP70]], align 4811// CHECK3-NEXT: [[TMP71:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 6812// CHECK3-NEXT: store ptr null, ptr [[TMP71]], align 4813// CHECK3-NEXT: [[TMP72:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 7814// CHECK3-NEXT: store ptr null, ptr [[TMP72]], align 4815// CHECK3-NEXT: [[TMP73:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 8816// CHECK3-NEXT: store i64 [[TMP64]], ptr [[TMP73]], align 8817// CHECK3-NEXT: [[TMP74:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 9818// CHECK3-NEXT: store i64 0, ptr [[TMP74]], align 8819// CHECK3-NEXT: [[TMP75:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 10820// CHECK3-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP75]], align 4821// CHECK3-NEXT: [[TMP76:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 11822// CHECK3-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP76]], align 4823// CHECK3-NEXT: [[TMP77:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS15]], i32 0, i32 12824// CHECK3-NEXT: store i32 0, ptr [[TMP77]], align 4825// CHECK3-NEXT: [[TMP78:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36.region_id, ptr [[KERNEL_ARGS15]])826// CHECK3-NEXT: [[TMP79:%.*]] = icmp ne i32 [[TMP78]], 0827// CHECK3-NEXT: br i1 [[TMP79]], label [[OMP_OFFLOAD_FAILED16:%.*]], label [[OMP_OFFLOAD_CONT17:%.*]]828// CHECK3: omp_offload.failed16:829// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36(i32 [[TMP52]], ptr @a) #[[ATTR3]]830// CHECK3-NEXT: br label [[OMP_OFFLOAD_CONT17]]831// CHECK3: omp_offload.cont17:832// CHECK3-NEXT: [[TMP80:%.*]] = load i32, ptr @a, align 4833// CHECK3-NEXT: ret i32 [[TMP80]]834//835//836// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30837// CHECK3-SAME: (i32 noundef [[TE:%.*]], i32 noundef [[TH:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]], i32 noundef [[I:%.*]], i32 noundef [[N:%.*]]) #[[ATTR1:[0-9]+]] {838// CHECK3-NEXT: entry:839// CHECK3-NEXT: [[TE_ADDR:%.*]] = alloca i32, align 4840// CHECK3-NEXT: [[TH_ADDR:%.*]] = alloca i32, align 4841// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 4842// CHECK3-NEXT: [[I_ADDR:%.*]] = alloca i32, align 4843// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4844// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])845// CHECK3-NEXT: store i32 [[TE]], ptr [[TE_ADDR]], align 4846// CHECK3-NEXT: store i32 [[TH]], ptr [[TH_ADDR]], align 4847// CHECK3-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 4848// CHECK3-NEXT: store i32 [[I]], ptr [[I_ADDR]], align 4849// CHECK3-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4850// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 4851// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_ADDR]], align 4852// CHECK3-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_ADDR]], align 4853// CHECK3-NEXT: call void @__kmpc_push_num_teams(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP2]], i32 [[TMP3]])854// CHECK3-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30.omp_outlined, ptr [[I_ADDR]], ptr [[N_ADDR]], ptr [[TMP1]])855// CHECK3-NEXT: ret void856//857//858// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l30.omp_outlined859// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[I:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]]) #[[ATTR1]] {860// CHECK3-NEXT: entry:861// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4862// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4863// CHECK3-NEXT: [[I_ADDR:%.*]] = alloca ptr, align 4864// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 4865// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 4866// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4867// CHECK3-NEXT: [[TMP:%.*]] = alloca i32, align 4868// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4869// CHECK3-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4870// CHECK3-NEXT: [[I3:%.*]] = alloca i32, align 4871// CHECK3-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4872// CHECK3-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4873// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4874// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4875// CHECK3-NEXT: [[I4:%.*]] = alloca i32, align 4876// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4877// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4878// CHECK3-NEXT: store ptr [[I]], ptr [[I_ADDR]], align 4879// CHECK3-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 4880// CHECK3-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 4881// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[I_ADDR]], align 4882// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[N_ADDR]], align 4883// CHECK3-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 4884// CHECK3-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP1]], align 4885// CHECK3-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4886// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4887// CHECK3-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0888// CHECK3-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1889// CHECK3-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1890// CHECK3-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4891// CHECK3-NEXT: store i32 0, ptr [[I3]], align 4892// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4893// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]894// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]895// CHECK3: omp.precond.then:896// CHECK3-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [100 x i32], ptr [[TMP2]], i32 0, i32 0897// CHECK3-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[ARRAYDECAY]], i32 16) ]898// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4899// CHECK3-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4900// CHECK3-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4901// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4902// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4903// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4904// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4905// CHECK3-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)906// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4907// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4908// CHECK3-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]909// CHECK3-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]910// CHECK3: cond.true:911// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4912// CHECK3-NEXT: br label [[COND_END:%.*]]913// CHECK3: cond.false:914// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4915// CHECK3-NEXT: br label [[COND_END]]916// CHECK3: cond.end:917// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]918// CHECK3-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4919// CHECK3-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4920// CHECK3-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4921// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]922// CHECK3: omp.inner.for.cond:923// CHECK3-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6:![0-9]+]]924// CHECK3-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP6]]925// CHECK3-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]926// CHECK3-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]927// CHECK3: omp.inner.for.body:928// CHECK3-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]929// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 1930// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]931// CHECK3-NEXT: store i32 [[ADD]], ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP6]]932// CHECK3-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP6]]933// CHECK3-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr [[TMP2]], i32 0, i32 [[TMP17]]934// CHECK3-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP6]]935// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]936// CHECK3: omp.body.continue:937// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]938// CHECK3: omp.inner.for.inc:939// CHECK3-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]940// CHECK3-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP18]], 1941// CHECK3-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]942// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]943// CHECK3: omp.inner.for.end:944// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]945// CHECK3: omp.loop.exit:946// CHECK3-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4947// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4948// CHECK3-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])949// CHECK3-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4950// CHECK3-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0951// CHECK3-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]952// CHECK3: .omp.final.then:953// CHECK3-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4954// CHECK3-NEXT: [[SUB8:%.*]] = sub nsw i32 [[TMP23]], 0955// CHECK3-NEXT: [[DIV9:%.*]] = sdiv i32 [[SUB8]], 1956// CHECK3-NEXT: [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 1957// CHECK3-NEXT: [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]958// CHECK3-NEXT: store i32 [[ADD11]], ptr [[TMP0]], align 4959// CHECK3-NEXT: br label [[DOTOMP_FINAL_DONE]]960// CHECK3: .omp.final.done:961// CHECK3-NEXT: br label [[OMP_PRECOND_END]]962// CHECK3: omp.precond.end:963// CHECK3-NEXT: ret void964//965//966// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36967// CHECK3-SAME: (i32 noundef [[N:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]]) #[[ATTR1]] {968// CHECK3-NEXT: entry:969// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4970// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 4971// CHECK3-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4972// CHECK3-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 4973// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 4974// CHECK3-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36.omp_outlined, ptr [[N_ADDR]], ptr [[TMP0]])975// CHECK3-NEXT: ret void976//977//978// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z21teams_argument_globali_l36.omp_outlined979// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[A:%.*]]) #[[ATTR1]] {980// CHECK3-NEXT: entry:981// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4982// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4983// CHECK3-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 4984// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 4985// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4986// CHECK3-NEXT: [[TMP:%.*]] = alloca i32, align 4987// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4988// CHECK3-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4989// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4990// CHECK3-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4991// CHECK3-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4992// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4993// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4994// CHECK3-NEXT: [[I3:%.*]] = alloca i32, align 4995// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4996// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4997// CHECK3-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 4998// CHECK3-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 4999// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 41000// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 41001// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 41002// CHECK3-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_]], align 41003// CHECK3-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41004// CHECK3-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 01005// CHECK3-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11006// CHECK3-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11007// CHECK3-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41008// CHECK3-NEXT: store i32 0, ptr [[I]], align 41009// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41010// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]1011// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1012// CHECK3: omp.precond.then:1013// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41014// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41015// CHECK3-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 41016// CHECK3-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41017// CHECK3-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41018// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41019// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 41020// CHECK3-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP7]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1021// CHECK3-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41022// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41023// CHECK3-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]1024// CHECK3-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1025// CHECK3: cond.true:1026// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41027// CHECK3-NEXT: br label [[COND_END:%.*]]1028// CHECK3: cond.false:1029// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41030// CHECK3-NEXT: br label [[COND_END]]1031// CHECK3: cond.end:1032// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]1033// CHECK3-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41034// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41035// CHECK3-NEXT: store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 41036// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1037// CHECK3: omp.inner.for.cond:1038// CHECK3-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41039// CHECK3-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41040// CHECK3-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]1041// CHECK3-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1042// CHECK3: omp.inner.for.body:1043// CHECK3-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41044// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 11045// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1046// CHECK3-NEXT: store i32 [[ADD]], ptr [[I3]], align 41047// CHECK3-NEXT: [[TMP16:%.*]] = load i32, ptr [[I3]], align 41048// CHECK3-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr [[TMP1]], i32 0, i32 [[TMP16]]1049// CHECK3-NEXT: store i32 0, ptr [[ARRAYIDX]], align 41050// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1051// CHECK3: omp.body.continue:1052// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1053// CHECK3: omp.inner.for.inc:1054// CHECK3-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41055// CHECK3-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP17]], 11056// CHECK3-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 41057// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]1058// CHECK3: omp.inner.for.end:1059// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1060// CHECK3: omp.loop.exit:1061// CHECK3-NEXT: [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41062// CHECK3-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 41063// CHECK3-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])1064// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41065// CHECK3-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 01066// CHECK3-NEXT: br i1 [[TMP21]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1067// CHECK3: .omp.final.then:1068// CHECK3-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41069// CHECK3-NEXT: [[SUB7:%.*]] = sub nsw i32 [[TMP22]], 01070// CHECK3-NEXT: [[DIV8:%.*]] = sdiv i32 [[SUB7]], 11071// CHECK3-NEXT: [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 11072// CHECK3-NEXT: [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]1073// CHECK3-NEXT: store i32 [[ADD10]], ptr [[I3]], align 41074// CHECK3-NEXT: br label [[DOTOMP_FINAL_DONE]]1075// CHECK3: .omp.final.done:1076// CHECK3-NEXT: br label [[OMP_PRECOND_END]]1077// CHECK3: omp.precond.end:1078// CHECK3-NEXT: ret void1079//1080//1081// CHECK5-LABEL: define {{[^@]+}}@_Z21teams_argument_globali1082// CHECK5-SAME: (i32 noundef signext [[N:%.*]]) #[[ATTR0:[0-9]+]] {1083// CHECK5-NEXT: entry:1084// CHECK5-NEXT: [[N_ADDR:%.*]] = alloca i32, align 41085// CHECK5-NEXT: [[I:%.*]] = alloca i32, align 41086// CHECK5-NEXT: [[TE:%.*]] = alloca i32, align 41087// CHECK5-NEXT: [[TH:%.*]] = alloca i32, align 41088// CHECK5-NEXT: [[TMP:%.*]] = alloca i32, align 41089// CHECK5-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41090// CHECK5-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41091// CHECK5-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41092// CHECK5-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41093// CHECK5-NEXT: [[I4:%.*]] = alloca i32, align 41094// CHECK5-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41095// CHECK5-NEXT: [[DOTLINEAR_START:%.*]] = alloca i32, align 41096// CHECK5-NEXT: [[I5:%.*]] = alloca i32, align 41097// CHECK5-NEXT: [[I6:%.*]] = alloca i32, align 41098// CHECK5-NEXT: [[_TMP13:%.*]] = alloca i32, align 41099// CHECK5-NEXT: [[DOTCAPTURE_EXPR_14:%.*]] = alloca i32, align 41100// CHECK5-NEXT: [[DOTCAPTURE_EXPR_15:%.*]] = alloca i32, align 41101// CHECK5-NEXT: [[DOTOMP_LB19:%.*]] = alloca i32, align 41102// CHECK5-NEXT: [[DOTOMP_UB20:%.*]] = alloca i32, align 41103// CHECK5-NEXT: [[I21:%.*]] = alloca i32, align 41104// CHECK5-NEXT: [[DOTOMP_IV24:%.*]] = alloca i32, align 41105// CHECK5-NEXT: [[I25:%.*]] = alloca i32, align 41106// CHECK5-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 41107// CHECK5-NEXT: [[TMP0:%.*]] = load i32, ptr [[N_ADDR]], align 41108// CHECK5-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], 1281109// CHECK5-NEXT: store i32 [[DIV]], ptr [[TE]], align 41110// CHECK5-NEXT: store i32 128, ptr [[TH]], align 41111// CHECK5-NEXT: [[TMP1:%.*]] = load i32, ptr [[N_ADDR]], align 41112// CHECK5-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_]], align 41113// CHECK5-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41114// CHECK5-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP2]], 01115// CHECK5-NEXT: [[DIV2:%.*]] = sdiv i32 [[SUB]], 11116// CHECK5-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV2]], 11117// CHECK5-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_1]], align 41118// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41119// CHECK5-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41120// CHECK5-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_UB]], align 41121// CHECK5-NEXT: store i32 0, ptr [[I4]], align 41122// CHECK5-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41123// CHECK5-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]1124// CHECK5-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]1125// CHECK5: simd.if.then:1126// CHECK5-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41127// CHECK5-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 41128// CHECK5-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr @a, i64 16) ]1129// CHECK5-NEXT: [[TMP6:%.*]] = load i32, ptr [[I]], align 41130// CHECK5-NEXT: store i32 [[TMP6]], ptr [[DOTLINEAR_START]], align 41131// CHECK5-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1132// CHECK5: omp.inner.for.cond:1133// CHECK5-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]1134// CHECK5-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP2]]1135// CHECK5-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]1136// CHECK5-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1137// CHECK5: omp.inner.for.body:1138// CHECK5-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]1139// CHECK5-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 11140// CHECK5-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1141// CHECK5-NEXT: store i32 [[ADD]], ptr [[I5]], align 4, !llvm.access.group [[ACC_GRP2]]1142// CHECK5-NEXT: [[TMP10:%.*]] = load i32, ptr [[I5]], align 4, !llvm.access.group [[ACC_GRP2]]1143// CHECK5-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP10]] to i641144// CHECK5-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr @a, i64 0, i64 [[IDXPROM]]1145// CHECK5-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP2]]1146// CHECK5-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1147// CHECK5: omp.body.continue:1148// CHECK5-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1149// CHECK5: omp.inner.for.inc:1150// CHECK5-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]1151// CHECK5-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP11]], 11152// CHECK5-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]1153// CHECK5-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]1154// CHECK5: omp.inner.for.end:1155// CHECK5-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41156// CHECK5-NEXT: [[SUB9:%.*]] = sub nsw i32 [[TMP12]], 01157// CHECK5-NEXT: [[DIV10:%.*]] = sdiv i32 [[SUB9]], 11158// CHECK5-NEXT: [[MUL11:%.*]] = mul nsw i32 [[DIV10]], 11159// CHECK5-NEXT: [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]1160// CHECK5-NEXT: store i32 [[ADD12]], ptr [[I]], align 41161// CHECK5-NEXT: br label [[SIMD_IF_END]]1162// CHECK5: simd.if.end:1163// CHECK5-NEXT: [[TMP13:%.*]] = load i32, ptr [[N_ADDR]], align 41164// CHECK5-NEXT: store i32 [[TMP13]], ptr [[DOTCAPTURE_EXPR_14]], align 41165// CHECK5-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_14]], align 41166// CHECK5-NEXT: [[SUB16:%.*]] = sub nsw i32 [[TMP14]], 01167// CHECK5-NEXT: [[DIV17:%.*]] = sdiv i32 [[SUB16]], 11168// CHECK5-NEXT: [[SUB18:%.*]] = sub nsw i32 [[DIV17]], 11169// CHECK5-NEXT: store i32 [[SUB18]], ptr [[DOTCAPTURE_EXPR_15]], align 41170// CHECK5-NEXT: store i32 0, ptr [[DOTOMP_LB19]], align 41171// CHECK5-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_15]], align 41172// CHECK5-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_UB20]], align 41173// CHECK5-NEXT: store i32 0, ptr [[I21]], align 41174// CHECK5-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_14]], align 41175// CHECK5-NEXT: [[CMP22:%.*]] = icmp slt i32 0, [[TMP16]]1176// CHECK5-NEXT: br i1 [[CMP22]], label [[SIMD_IF_THEN23:%.*]], label [[SIMD_IF_END41:%.*]]1177// CHECK5: simd.if.then23:1178// CHECK5-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_LB19]], align 41179// CHECK5-NEXT: store i32 [[TMP17]], ptr [[DOTOMP_IV24]], align 41180// CHECK5-NEXT: br label [[OMP_INNER_FOR_COND26:%.*]]1181// CHECK5: omp.inner.for.cond26:1182// CHECK5-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV24]], align 41183// CHECK5-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_UB20]], align 41184// CHECK5-NEXT: [[CMP27:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]1185// CHECK5-NEXT: br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END36:%.*]]1186// CHECK5: omp.inner.for.body28:1187// CHECK5-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV24]], align 41188// CHECK5-NEXT: [[MUL29:%.*]] = mul nsw i32 [[TMP20]], 11189// CHECK5-NEXT: [[ADD30:%.*]] = add nsw i32 0, [[MUL29]]1190// CHECK5-NEXT: store i32 [[ADD30]], ptr [[I25]], align 41191// CHECK5-NEXT: [[TMP21:%.*]] = load i32, ptr [[I25]], align 41192// CHECK5-NEXT: [[IDXPROM31:%.*]] = sext i32 [[TMP21]] to i641193// CHECK5-NEXT: [[ARRAYIDX32:%.*]] = getelementptr inbounds [100 x i32], ptr @a, i64 0, i64 [[IDXPROM31]]1194// CHECK5-NEXT: store i32 0, ptr [[ARRAYIDX32]], align 41195// CHECK5-NEXT: br label [[OMP_BODY_CONTINUE33:%.*]]1196// CHECK5: omp.body.continue33:1197// CHECK5-NEXT: br label [[OMP_INNER_FOR_INC34:%.*]]1198// CHECK5: omp.inner.for.inc34:1199// CHECK5-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IV24]], align 41200// CHECK5-NEXT: [[ADD35:%.*]] = add nsw i32 [[TMP22]], 11201// CHECK5-NEXT: store i32 [[ADD35]], ptr [[DOTOMP_IV24]], align 41202// CHECK5-NEXT: br label [[OMP_INNER_FOR_COND26]], !llvm.loop [[LOOP7:![0-9]+]]1203// CHECK5: omp.inner.for.end36:1204// CHECK5-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_14]], align 41205// CHECK5-NEXT: [[SUB37:%.*]] = sub nsw i32 [[TMP23]], 01206// CHECK5-NEXT: [[DIV38:%.*]] = sdiv i32 [[SUB37]], 11207// CHECK5-NEXT: [[MUL39:%.*]] = mul nsw i32 [[DIV38]], 11208// CHECK5-NEXT: [[ADD40:%.*]] = add nsw i32 0, [[MUL39]]1209// CHECK5-NEXT: store i32 [[ADD40]], ptr [[I25]], align 41210// CHECK5-NEXT: br label [[SIMD_IF_END41]]1211// CHECK5: simd.if.end41:1212// CHECK5-NEXT: [[TMP24:%.*]] = load i32, ptr @a, align 41213// CHECK5-NEXT: ret i32 [[TMP24]]1214//1215//1216// CHECK7-LABEL: define {{[^@]+}}@_Z21teams_argument_globali1217// CHECK7-SAME: (i32 noundef [[N:%.*]]) #[[ATTR0:[0-9]+]] {1218// CHECK7-NEXT: entry:1219// CHECK7-NEXT: [[N_ADDR:%.*]] = alloca i32, align 41220// CHECK7-NEXT: [[I:%.*]] = alloca i32, align 41221// CHECK7-NEXT: [[TE:%.*]] = alloca i32, align 41222// CHECK7-NEXT: [[TH:%.*]] = alloca i32, align 41223// CHECK7-NEXT: [[TMP:%.*]] = alloca i32, align 41224// CHECK7-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41225// CHECK7-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41226// CHECK7-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41227// CHECK7-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41228// CHECK7-NEXT: [[I4:%.*]] = alloca i32, align 41229// CHECK7-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41230// CHECK7-NEXT: [[DOTLINEAR_START:%.*]] = alloca i32, align 41231// CHECK7-NEXT: [[I5:%.*]] = alloca i32, align 41232// CHECK7-NEXT: [[I6:%.*]] = alloca i32, align 41233// CHECK7-NEXT: [[_TMP13:%.*]] = alloca i32, align 41234// CHECK7-NEXT: [[DOTCAPTURE_EXPR_14:%.*]] = alloca i32, align 41235// CHECK7-NEXT: [[DOTCAPTURE_EXPR_15:%.*]] = alloca i32, align 41236// CHECK7-NEXT: [[DOTOMP_LB19:%.*]] = alloca i32, align 41237// CHECK7-NEXT: [[DOTOMP_UB20:%.*]] = alloca i32, align 41238// CHECK7-NEXT: [[I21:%.*]] = alloca i32, align 41239// CHECK7-NEXT: [[DOTOMP_IV24:%.*]] = alloca i32, align 41240// CHECK7-NEXT: [[I25:%.*]] = alloca i32, align 41241// CHECK7-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 41242// CHECK7-NEXT: [[TMP0:%.*]] = load i32, ptr [[N_ADDR]], align 41243// CHECK7-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], 1281244// CHECK7-NEXT: store i32 [[DIV]], ptr [[TE]], align 41245// CHECK7-NEXT: store i32 128, ptr [[TH]], align 41246// CHECK7-NEXT: [[TMP1:%.*]] = load i32, ptr [[N_ADDR]], align 41247// CHECK7-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_]], align 41248// CHECK7-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41249// CHECK7-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP2]], 01250// CHECK7-NEXT: [[DIV2:%.*]] = sdiv i32 [[SUB]], 11251// CHECK7-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV2]], 11252// CHECK7-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_1]], align 41253// CHECK7-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41254// CHECK7-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41255// CHECK7-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_UB]], align 41256// CHECK7-NEXT: store i32 0, ptr [[I4]], align 41257// CHECK7-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41258// CHECK7-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]1259// CHECK7-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]1260// CHECK7: simd.if.then:1261// CHECK7-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41262// CHECK7-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 41263// CHECK7-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr @a, i32 16) ]1264// CHECK7-NEXT: [[TMP6:%.*]] = load i32, ptr [[I]], align 41265// CHECK7-NEXT: store i32 [[TMP6]], ptr [[DOTLINEAR_START]], align 41266// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1267// CHECK7: omp.inner.for.cond:1268// CHECK7-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]1269// CHECK7-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP3]]1270// CHECK7-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]1271// CHECK7-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1272// CHECK7: omp.inner.for.body:1273// CHECK7-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]1274// CHECK7-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 11275// CHECK7-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1276// CHECK7-NEXT: store i32 [[ADD]], ptr [[I5]], align 4, !llvm.access.group [[ACC_GRP3]]1277// CHECK7-NEXT: [[TMP10:%.*]] = load i32, ptr [[I5]], align 4, !llvm.access.group [[ACC_GRP3]]1278// CHECK7-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr @a, i32 0, i32 [[TMP10]]1279// CHECK7-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP3]]1280// CHECK7-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1281// CHECK7: omp.body.continue:1282// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1283// CHECK7: omp.inner.for.inc:1284// CHECK7-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]1285// CHECK7-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP11]], 11286// CHECK7-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]1287// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]1288// CHECK7: omp.inner.for.end:1289// CHECK7-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41290// CHECK7-NEXT: [[SUB9:%.*]] = sub nsw i32 [[TMP12]], 01291// CHECK7-NEXT: [[DIV10:%.*]] = sdiv i32 [[SUB9]], 11292// CHECK7-NEXT: [[MUL11:%.*]] = mul nsw i32 [[DIV10]], 11293// CHECK7-NEXT: [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]1294// CHECK7-NEXT: store i32 [[ADD12]], ptr [[I]], align 41295// CHECK7-NEXT: br label [[SIMD_IF_END]]1296// CHECK7: simd.if.end:1297// CHECK7-NEXT: [[TMP13:%.*]] = load i32, ptr [[N_ADDR]], align 41298// CHECK7-NEXT: store i32 [[TMP13]], ptr [[DOTCAPTURE_EXPR_14]], align 41299// CHECK7-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_14]], align 41300// CHECK7-NEXT: [[SUB16:%.*]] = sub nsw i32 [[TMP14]], 01301// CHECK7-NEXT: [[DIV17:%.*]] = sdiv i32 [[SUB16]], 11302// CHECK7-NEXT: [[SUB18:%.*]] = sub nsw i32 [[DIV17]], 11303// CHECK7-NEXT: store i32 [[SUB18]], ptr [[DOTCAPTURE_EXPR_15]], align 41304// CHECK7-NEXT: store i32 0, ptr [[DOTOMP_LB19]], align 41305// CHECK7-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_15]], align 41306// CHECK7-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_UB20]], align 41307// CHECK7-NEXT: store i32 0, ptr [[I21]], align 41308// CHECK7-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_14]], align 41309// CHECK7-NEXT: [[CMP22:%.*]] = icmp slt i32 0, [[TMP16]]1310// CHECK7-NEXT: br i1 [[CMP22]], label [[SIMD_IF_THEN23:%.*]], label [[SIMD_IF_END40:%.*]]1311// CHECK7: simd.if.then23:1312// CHECK7-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_LB19]], align 41313// CHECK7-NEXT: store i32 [[TMP17]], ptr [[DOTOMP_IV24]], align 41314// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND26:%.*]]1315// CHECK7: omp.inner.for.cond26:1316// CHECK7-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV24]], align 41317// CHECK7-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_UB20]], align 41318// CHECK7-NEXT: [[CMP27:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]]1319// CHECK7-NEXT: br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END35:%.*]]1320// CHECK7: omp.inner.for.body28:1321// CHECK7-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV24]], align 41322// CHECK7-NEXT: [[MUL29:%.*]] = mul nsw i32 [[TMP20]], 11323// CHECK7-NEXT: [[ADD30:%.*]] = add nsw i32 0, [[MUL29]]1324// CHECK7-NEXT: store i32 [[ADD30]], ptr [[I25]], align 41325// CHECK7-NEXT: [[TMP21:%.*]] = load i32, ptr [[I25]], align 41326// CHECK7-NEXT: [[ARRAYIDX31:%.*]] = getelementptr inbounds [100 x i32], ptr @a, i32 0, i32 [[TMP21]]1327// CHECK7-NEXT: store i32 0, ptr [[ARRAYIDX31]], align 41328// CHECK7-NEXT: br label [[OMP_BODY_CONTINUE32:%.*]]1329// CHECK7: omp.body.continue32:1330// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC33:%.*]]1331// CHECK7: omp.inner.for.inc33:1332// CHECK7-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IV24]], align 41333// CHECK7-NEXT: [[ADD34:%.*]] = add nsw i32 [[TMP22]], 11334// CHECK7-NEXT: store i32 [[ADD34]], ptr [[DOTOMP_IV24]], align 41335// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND26]], !llvm.loop [[LOOP8:![0-9]+]]1336// CHECK7: omp.inner.for.end35:1337// CHECK7-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_14]], align 41338// CHECK7-NEXT: [[SUB36:%.*]] = sub nsw i32 [[TMP23]], 01339// CHECK7-NEXT: [[DIV37:%.*]] = sdiv i32 [[SUB36]], 11340// CHECK7-NEXT: [[MUL38:%.*]] = mul nsw i32 [[DIV37]], 11341// CHECK7-NEXT: [[ADD39:%.*]] = add nsw i32 0, [[MUL38]]1342// CHECK7-NEXT: store i32 [[ADD39]], ptr [[I25]], align 41343// CHECK7-NEXT: br label [[SIMD_IF_END40]]1344// CHECK7: simd.if.end40:1345// CHECK7-NEXT: [[TMP24:%.*]] = load i32, ptr @a, align 41346// CHECK7-NEXT: ret i32 [[TMP24]]1347//1348//1349// CHECK9-LABEL: define {{[^@]+}}@_Z15teams_local_argv1350// CHECK9-SAME: () #[[ATTR0:[0-9]+]] {1351// CHECK9-NEXT: entry:1352// CHECK9-NEXT: [[N:%.*]] = alloca i32, align 41353// CHECK9-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81354// CHECK9-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81355// CHECK9-NEXT: [[N_CASTED:%.*]] = alloca i64, align 81356// CHECK9-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 81357// CHECK9-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 81358// CHECK9-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 81359// CHECK9-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 81360// CHECK9-NEXT: [[TMP:%.*]] = alloca i32, align 41361// CHECK9-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41362// CHECK9-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41363// CHECK9-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81364// CHECK9-NEXT: store i32 100, ptr [[N]], align 41365// CHECK9-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 41366// CHECK9-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i641367// CHECK9-NEXT: [[TMP2:%.*]] = call ptr @llvm.stacksave.p0()1368// CHECK9-NEXT: store ptr [[TMP2]], ptr [[SAVED_STACK]], align 81369// CHECK9-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 41370// CHECK9-NEXT: store i64 [[TMP1]], ptr [[__VLA_EXPR0]], align 81371// CHECK9-NEXT: [[TMP3:%.*]] = load i32, ptr [[N]], align 41372// CHECK9-NEXT: store i32 [[TMP3]], ptr [[N_CASTED]], align 41373// CHECK9-NEXT: [[TMP4:%.*]] = load i64, ptr [[N_CASTED]], align 81374// CHECK9-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP1]], 41375// CHECK9-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DOTOFFLOAD_SIZES]], ptr align 8 @.offload_sizes, i64 24, i1 false)1376// CHECK9-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01377// CHECK9-NEXT: store i64 [[TMP4]], ptr [[TMP6]], align 81378// CHECK9-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01379// CHECK9-NEXT: store i64 [[TMP4]], ptr [[TMP7]], align 81380// CHECK9-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 01381// CHECK9-NEXT: store ptr null, ptr [[TMP8]], align 81382// CHECK9-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11383// CHECK9-NEXT: store i64 [[TMP1]], ptr [[TMP9]], align 81384// CHECK9-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11385// CHECK9-NEXT: store i64 [[TMP1]], ptr [[TMP10]], align 81386// CHECK9-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 11387// CHECK9-NEXT: store ptr null, ptr [[TMP11]], align 81388// CHECK9-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21389// CHECK9-NEXT: store ptr [[VLA]], ptr [[TMP12]], align 81390// CHECK9-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21391// CHECK9-NEXT: store ptr [[VLA]], ptr [[TMP13]], align 81392// CHECK9-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 21393// CHECK9-NEXT: store i64 [[TMP5]], ptr [[TMP14]], align 81394// CHECK9-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 21395// CHECK9-NEXT: store ptr null, ptr [[TMP15]], align 81396// CHECK9-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01397// CHECK9-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01398// CHECK9-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 01399// CHECK9-NEXT: [[TMP19:%.*]] = load i32, ptr [[N]], align 41400// CHECK9-NEXT: store i32 [[TMP19]], ptr [[DOTCAPTURE_EXPR_]], align 41401// CHECK9-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41402// CHECK9-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP20]], 01403// CHECK9-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11404// CHECK9-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11405// CHECK9-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41406// CHECK9-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41407// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP21]], 11408// CHECK9-NEXT: [[TMP22:%.*]] = zext i32 [[ADD]] to i641409// CHECK9-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01410// CHECK9-NEXT: store i32 3, ptr [[TMP23]], align 41411// CHECK9-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11412// CHECK9-NEXT: store i32 3, ptr [[TMP24]], align 41413// CHECK9-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21414// CHECK9-NEXT: store ptr [[TMP16]], ptr [[TMP25]], align 81415// CHECK9-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31416// CHECK9-NEXT: store ptr [[TMP17]], ptr [[TMP26]], align 81417// CHECK9-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41418// CHECK9-NEXT: store ptr [[TMP18]], ptr [[TMP27]], align 81419// CHECK9-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51420// CHECK9-NEXT: store ptr @.offload_maptypes, ptr [[TMP28]], align 81421// CHECK9-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61422// CHECK9-NEXT: store ptr null, ptr [[TMP29]], align 81423// CHECK9-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71424// CHECK9-NEXT: store ptr null, ptr [[TMP30]], align 81425// CHECK9-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81426// CHECK9-NEXT: store i64 [[TMP22]], ptr [[TMP31]], align 81427// CHECK9-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91428// CHECK9-NEXT: store i64 0, ptr [[TMP32]], align 81429// CHECK9-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101430// CHECK9-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP33]], align 41431// CHECK9-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111432// CHECK9-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP34]], align 41433// CHECK9-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121434// CHECK9-NEXT: store i32 0, ptr [[TMP35]], align 41435// CHECK9-NEXT: [[TMP36:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75.region_id, ptr [[KERNEL_ARGS]])1436// CHECK9-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 01437// CHECK9-NEXT: br i1 [[TMP37]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1438// CHECK9: omp_offload.failed:1439// CHECK9-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75(i64 [[TMP4]], i64 [[TMP1]], ptr [[VLA]]) #[[ATTR3:[0-9]+]]1440// CHECK9-NEXT: br label [[OMP_OFFLOAD_CONT]]1441// CHECK9: omp_offload.cont:1442// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 01443// CHECK9-NEXT: [[TMP38:%.*]] = load i32, ptr [[ARRAYIDX]], align 41444// CHECK9-NEXT: [[TMP39:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81445// CHECK9-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP39]])1446// CHECK9-NEXT: ret i32 [[TMP38]]1447//1448//1449// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l751450// CHECK9-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {1451// CHECK9-NEXT: entry:1452// CHECK9-NEXT: [[N_ADDR:%.*]] = alloca i64, align 81453// CHECK9-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81454// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 81455// CHECK9-NEXT: store i64 [[N]], ptr [[N_ADDR]], align 81456// CHECK9-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81457// CHECK9-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 81458// CHECK9-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 81459// CHECK9-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 81460// CHECK9-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75.omp_outlined, ptr [[N_ADDR]], i64 [[TMP0]], ptr [[TMP1]])1461// CHECK9-NEXT: ret void1462//1463//1464// CHECK9-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75.omp_outlined1465// CHECK9-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {1466// CHECK9-NEXT: entry:1467// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81468// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81469// CHECK9-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 81470// CHECK9-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 81471// CHECK9-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 81472// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41473// CHECK9-NEXT: [[TMP:%.*]] = alloca i32, align 41474// CHECK9-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41475// CHECK9-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41476// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 41477// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41478// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41479// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41480// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41481// CHECK9-NEXT: [[I3:%.*]] = alloca i32, align 41482// CHECK9-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81483// CHECK9-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81484// CHECK9-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 81485// CHECK9-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 81486// CHECK9-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 81487// CHECK9-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81488// CHECK9-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR]], align 81489// CHECK9-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 81490// CHECK9-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41491// CHECK9-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41492// CHECK9-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41493// CHECK9-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 01494// CHECK9-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11495// CHECK9-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11496// CHECK9-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41497// CHECK9-NEXT: store i32 0, ptr [[I]], align 41498// CHECK9-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41499// CHECK9-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]1500// CHECK9-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1501// CHECK9: omp.precond.then:1502// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41503// CHECK9-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41504// CHECK9-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41505// CHECK9-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41506// CHECK9-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41507// CHECK9-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81508// CHECK9-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41509// CHECK9-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1510// CHECK9-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41511// CHECK9-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41512// CHECK9-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]1513// CHECK9-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1514// CHECK9: cond.true:1515// CHECK9-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41516// CHECK9-NEXT: br label [[COND_END:%.*]]1517// CHECK9: cond.false:1518// CHECK9-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41519// CHECK9-NEXT: br label [[COND_END]]1520// CHECK9: cond.end:1521// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1522// CHECK9-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41523// CHECK9-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41524// CHECK9-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41525// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1526// CHECK9: omp.inner.for.cond:1527// CHECK9-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4:![0-9]+]]1528// CHECK9-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP4]]1529// CHECK9-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]1530// CHECK9-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1531// CHECK9: omp.inner.for.body:1532// CHECK9-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]1533// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 11534// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1535// CHECK9-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP4]]1536// CHECK9-NEXT: [[TMP17:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP4]]1537// CHECK9-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i641538// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[IDXPROM]]1539// CHECK9-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP4]]1540// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1541// CHECK9: omp.body.continue:1542// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1543// CHECK9: omp.inner.for.inc:1544// CHECK9-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]1545// CHECK9-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP18]], 11546// CHECK9-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]1547// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]]1548// CHECK9: omp.inner.for.end:1549// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1550// CHECK9: omp.loop.exit:1551// CHECK9-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81552// CHECK9-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 41553// CHECK9-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])1554// CHECK9-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41555// CHECK9-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 01556// CHECK9-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1557// CHECK9: .omp.final.then:1558// CHECK9-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41559// CHECK9-NEXT: [[SUB7:%.*]] = sub nsw i32 [[TMP23]], 01560// CHECK9-NEXT: [[DIV8:%.*]] = sdiv i32 [[SUB7]], 11561// CHECK9-NEXT: [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 11562// CHECK9-NEXT: [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]1563// CHECK9-NEXT: store i32 [[ADD10]], ptr [[I3]], align 41564// CHECK9-NEXT: br label [[DOTOMP_FINAL_DONE]]1565// CHECK9: .omp.final.done:1566// CHECK9-NEXT: br label [[OMP_PRECOND_END]]1567// CHECK9: omp.precond.end:1568// CHECK9-NEXT: ret void1569//1570//1571// CHECK11-LABEL: define {{[^@]+}}@_Z15teams_local_argv1572// CHECK11-SAME: () #[[ATTR0:[0-9]+]] {1573// CHECK11-NEXT: entry:1574// CHECK11-NEXT: [[N:%.*]] = alloca i32, align 41575// CHECK11-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 41576// CHECK11-NEXT: [[__VLA_EXPR0:%.*]] = alloca i32, align 41577// CHECK11-NEXT: [[N_CASTED:%.*]] = alloca i32, align 41578// CHECK11-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 41579// CHECK11-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 41580// CHECK11-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 41581// CHECK11-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 41582// CHECK11-NEXT: [[TMP:%.*]] = alloca i32, align 41583// CHECK11-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41584// CHECK11-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41585// CHECK11-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81586// CHECK11-NEXT: store i32 100, ptr [[N]], align 41587// CHECK11-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 41588// CHECK11-NEXT: [[TMP1:%.*]] = call ptr @llvm.stacksave.p0()1589// CHECK11-NEXT: store ptr [[TMP1]], ptr [[SAVED_STACK]], align 41590// CHECK11-NEXT: [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 41591// CHECK11-NEXT: store i32 [[TMP0]], ptr [[__VLA_EXPR0]], align 41592// CHECK11-NEXT: [[TMP2:%.*]] = load i32, ptr [[N]], align 41593// CHECK11-NEXT: store i32 [[TMP2]], ptr [[N_CASTED]], align 41594// CHECK11-NEXT: [[TMP3:%.*]] = load i32, ptr [[N_CASTED]], align 41595// CHECK11-NEXT: [[TMP4:%.*]] = mul nuw i32 [[TMP0]], 41596// CHECK11-NEXT: [[TMP5:%.*]] = sext i32 [[TMP4]] to i641597// CHECK11-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[DOTOFFLOAD_SIZES]], ptr align 4 @.offload_sizes, i32 24, i1 false)1598// CHECK11-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01599// CHECK11-NEXT: store i32 [[TMP3]], ptr [[TMP6]], align 41600// CHECK11-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01601// CHECK11-NEXT: store i32 [[TMP3]], ptr [[TMP7]], align 41602// CHECK11-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 01603// CHECK11-NEXT: store ptr null, ptr [[TMP8]], align 41604// CHECK11-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11605// CHECK11-NEXT: store i32 [[TMP0]], ptr [[TMP9]], align 41606// CHECK11-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11607// CHECK11-NEXT: store i32 [[TMP0]], ptr [[TMP10]], align 41608// CHECK11-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 11609// CHECK11-NEXT: store ptr null, ptr [[TMP11]], align 41610// CHECK11-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21611// CHECK11-NEXT: store ptr [[VLA]], ptr [[TMP12]], align 41612// CHECK11-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21613// CHECK11-NEXT: store ptr [[VLA]], ptr [[TMP13]], align 41614// CHECK11-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 21615// CHECK11-NEXT: store i64 [[TMP5]], ptr [[TMP14]], align 41616// CHECK11-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 21617// CHECK11-NEXT: store ptr null, ptr [[TMP15]], align 41618// CHECK11-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01619// CHECK11-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01620// CHECK11-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 01621// CHECK11-NEXT: [[TMP19:%.*]] = load i32, ptr [[N]], align 41622// CHECK11-NEXT: store i32 [[TMP19]], ptr [[DOTCAPTURE_EXPR_]], align 41623// CHECK11-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41624// CHECK11-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP20]], 01625// CHECK11-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11626// CHECK11-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11627// CHECK11-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41628// CHECK11-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41629// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP21]], 11630// CHECK11-NEXT: [[TMP22:%.*]] = zext i32 [[ADD]] to i641631// CHECK11-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01632// CHECK11-NEXT: store i32 3, ptr [[TMP23]], align 41633// CHECK11-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11634// CHECK11-NEXT: store i32 3, ptr [[TMP24]], align 41635// CHECK11-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 21636// CHECK11-NEXT: store ptr [[TMP16]], ptr [[TMP25]], align 41637// CHECK11-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 31638// CHECK11-NEXT: store ptr [[TMP17]], ptr [[TMP26]], align 41639// CHECK11-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 41640// CHECK11-NEXT: store ptr [[TMP18]], ptr [[TMP27]], align 41641// CHECK11-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 51642// CHECK11-NEXT: store ptr @.offload_maptypes, ptr [[TMP28]], align 41643// CHECK11-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 61644// CHECK11-NEXT: store ptr null, ptr [[TMP29]], align 41645// CHECK11-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 71646// CHECK11-NEXT: store ptr null, ptr [[TMP30]], align 41647// CHECK11-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 81648// CHECK11-NEXT: store i64 [[TMP22]], ptr [[TMP31]], align 81649// CHECK11-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 91650// CHECK11-NEXT: store i64 0, ptr [[TMP32]], align 81651// CHECK11-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 101652// CHECK11-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP33]], align 41653// CHECK11-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 111654// CHECK11-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP34]], align 41655// CHECK11-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 121656// CHECK11-NEXT: store i32 0, ptr [[TMP35]], align 41657// CHECK11-NEXT: [[TMP36:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75.region_id, ptr [[KERNEL_ARGS]])1658// CHECK11-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 01659// CHECK11-NEXT: br i1 [[TMP37]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]1660// CHECK11: omp_offload.failed:1661// CHECK11-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75(i32 [[TMP3]], i32 [[TMP0]], ptr [[VLA]]) #[[ATTR3:[0-9]+]]1662// CHECK11-NEXT: br label [[OMP_OFFLOAD_CONT]]1663// CHECK11: omp_offload.cont:1664// CHECK11-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i32 01665// CHECK11-NEXT: [[TMP38:%.*]] = load i32, ptr [[ARRAYIDX]], align 41666// CHECK11-NEXT: [[TMP39:%.*]] = load ptr, ptr [[SAVED_STACK]], align 41667// CHECK11-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP39]])1668// CHECK11-NEXT: ret i32 [[TMP38]]1669//1670//1671// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l751672// CHECK11-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {1673// CHECK11-NEXT: entry:1674// CHECK11-NEXT: [[N_ADDR:%.*]] = alloca i32, align 41675// CHECK11-NEXT: [[VLA_ADDR:%.*]] = alloca i32, align 41676// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 41677// CHECK11-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 41678// CHECK11-NEXT: store i32 [[VLA]], ptr [[VLA_ADDR]], align 41679// CHECK11-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 41680// CHECK11-NEXT: [[TMP0:%.*]] = load i32, ptr [[VLA_ADDR]], align 41681// CHECK11-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 41682// CHECK11-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75.omp_outlined, ptr [[N_ADDR]], i32 [[TMP0]], ptr [[TMP1]])1683// CHECK11-NEXT: ret void1684//1685//1686// CHECK11-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z15teams_local_argv_l75.omp_outlined1687// CHECK11-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {1688// CHECK11-NEXT: entry:1689// CHECK11-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41690// CHECK11-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41691// CHECK11-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 41692// CHECK11-NEXT: [[VLA_ADDR:%.*]] = alloca i32, align 41693// CHECK11-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 41694// CHECK11-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41695// CHECK11-NEXT: [[TMP:%.*]] = alloca i32, align 41696// CHECK11-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41697// CHECK11-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41698// CHECK11-NEXT: [[I:%.*]] = alloca i32, align 41699// CHECK11-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41700// CHECK11-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41701// CHECK11-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41702// CHECK11-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41703// CHECK11-NEXT: [[I3:%.*]] = alloca i32, align 41704// CHECK11-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41705// CHECK11-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41706// CHECK11-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 41707// CHECK11-NEXT: store i32 [[VLA]], ptr [[VLA_ADDR]], align 41708// CHECK11-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 41709// CHECK11-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 41710// CHECK11-NEXT: [[TMP1:%.*]] = load i32, ptr [[VLA_ADDR]], align 41711// CHECK11-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 41712// CHECK11-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41713// CHECK11-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41714// CHECK11-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41715// CHECK11-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 01716// CHECK11-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11717// CHECK11-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11718// CHECK11-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41719// CHECK11-NEXT: store i32 0, ptr [[I]], align 41720// CHECK11-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41721// CHECK11-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]1722// CHECK11-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1723// CHECK11: omp.precond.then:1724// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41725// CHECK11-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41726// CHECK11-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41727// CHECK11-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 41728// CHECK11-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 41729// CHECK11-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41730// CHECK11-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41731// CHECK11-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1732// CHECK11-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41733// CHECK11-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41734// CHECK11-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]1735// CHECK11-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1736// CHECK11: cond.true:1737// CHECK11-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41738// CHECK11-NEXT: br label [[COND_END:%.*]]1739// CHECK11: cond.false:1740// CHECK11-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41741// CHECK11-NEXT: br label [[COND_END]]1742// CHECK11: cond.end:1743// CHECK11-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1744// CHECK11-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 41745// CHECK11-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41746// CHECK11-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41747// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1748// CHECK11: omp.inner.for.cond:1749// CHECK11-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5:![0-9]+]]1750// CHECK11-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP5]]1751// CHECK11-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]1752// CHECK11-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1753// CHECK11: omp.inner.for.body:1754// CHECK11-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]1755// CHECK11-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 11756// CHECK11-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1757// CHECK11-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP5]]1758// CHECK11-NEXT: [[TMP17:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP5]]1759// CHECK11-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[TMP17]]1760// CHECK11-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP5]]1761// CHECK11-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1762// CHECK11: omp.body.continue:1763// CHECK11-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1764// CHECK11: omp.inner.for.inc:1765// CHECK11-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]1766// CHECK11-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP18]], 11767// CHECK11-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]1768// CHECK11-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]1769// CHECK11: omp.inner.for.end:1770// CHECK11-NEXT: br label [[OMP_LOOP_EXIT:%.*]]1771// CHECK11: omp.loop.exit:1772// CHECK11-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41773// CHECK11-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 41774// CHECK11-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])1775// CHECK11-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 41776// CHECK11-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 01777// CHECK11-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]1778// CHECK11: .omp.final.then:1779// CHECK11-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41780// CHECK11-NEXT: [[SUB7:%.*]] = sub nsw i32 [[TMP23]], 01781// CHECK11-NEXT: [[DIV8:%.*]] = sdiv i32 [[SUB7]], 11782// CHECK11-NEXT: [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 11783// CHECK11-NEXT: [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]1784// CHECK11-NEXT: store i32 [[ADD10]], ptr [[I3]], align 41785// CHECK11-NEXT: br label [[DOTOMP_FINAL_DONE]]1786// CHECK11: .omp.final.done:1787// CHECK11-NEXT: br label [[OMP_PRECOND_END]]1788// CHECK11: omp.precond.end:1789// CHECK11-NEXT: ret void1790//1791//1792// CHECK13-LABEL: define {{[^@]+}}@_Z15teams_local_argv1793// CHECK13-SAME: () #[[ATTR0:[0-9]+]] {1794// CHECK13-NEXT: entry:1795// CHECK13-NEXT: [[N:%.*]] = alloca i32, align 41796// CHECK13-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 81797// CHECK13-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 81798// CHECK13-NEXT: [[TMP:%.*]] = alloca i32, align 41799// CHECK13-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41800// CHECK13-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41801// CHECK13-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41802// CHECK13-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41803// CHECK13-NEXT: [[I:%.*]] = alloca i32, align 41804// CHECK13-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41805// CHECK13-NEXT: [[I3:%.*]] = alloca i32, align 41806// CHECK13-NEXT: store i32 100, ptr [[N]], align 41807// CHECK13-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 41808// CHECK13-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i641809// CHECK13-NEXT: [[TMP2:%.*]] = call ptr @llvm.stacksave.p0()1810// CHECK13-NEXT: store ptr [[TMP2]], ptr [[SAVED_STACK]], align 81811// CHECK13-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 41812// CHECK13-NEXT: store i64 [[TMP1]], ptr [[__VLA_EXPR0]], align 81813// CHECK13-NEXT: [[TMP3:%.*]] = load i32, ptr [[N]], align 41814// CHECK13-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41815// CHECK13-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41816// CHECK13-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 01817// CHECK13-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11818// CHECK13-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11819// CHECK13-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41820// CHECK13-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41821// CHECK13-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41822// CHECK13-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 41823// CHECK13-NEXT: store i32 0, ptr [[I]], align 41824// CHECK13-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41825// CHECK13-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]1826// CHECK13-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]1827// CHECK13: simd.if.then:1828// CHECK13-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41829// CHECK13-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 41830// CHECK13-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1831// CHECK13: omp.inner.for.cond:1832// CHECK13-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]1833// CHECK13-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP2]]1834// CHECK13-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]1835// CHECK13-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1836// CHECK13: omp.inner.for.body:1837// CHECK13-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]1838// CHECK13-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 11839// CHECK13-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1840// CHECK13-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP2]]1841// CHECK13-NEXT: [[TMP11:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP2]]1842// CHECK13-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i641843// CHECK13-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 [[IDXPROM]]1844// CHECK13-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP2]]1845// CHECK13-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1846// CHECK13: omp.body.continue:1847// CHECK13-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1848// CHECK13: omp.inner.for.inc:1849// CHECK13-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]1850// CHECK13-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP12]], 11851// CHECK13-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]1852// CHECK13-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]1853// CHECK13: omp.inner.for.end:1854// CHECK13-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41855// CHECK13-NEXT: [[SUB6:%.*]] = sub nsw i32 [[TMP13]], 01856// CHECK13-NEXT: [[DIV7:%.*]] = sdiv i32 [[SUB6]], 11857// CHECK13-NEXT: [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 11858// CHECK13-NEXT: [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]1859// CHECK13-NEXT: store i32 [[ADD9]], ptr [[I3]], align 41860// CHECK13-NEXT: br label [[SIMD_IF_END]]1861// CHECK13: simd.if.end:1862// CHECK13-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 01863// CHECK13-NEXT: [[TMP14:%.*]] = load i32, ptr [[ARRAYIDX10]], align 41864// CHECK13-NEXT: [[TMP15:%.*]] = load ptr, ptr [[SAVED_STACK]], align 81865// CHECK13-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP15]])1866// CHECK13-NEXT: ret i32 [[TMP14]]1867//1868//1869// CHECK15-LABEL: define {{[^@]+}}@_Z15teams_local_argv1870// CHECK15-SAME: () #[[ATTR0:[0-9]+]] {1871// CHECK15-NEXT: entry:1872// CHECK15-NEXT: [[N:%.*]] = alloca i32, align 41873// CHECK15-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 41874// CHECK15-NEXT: [[__VLA_EXPR0:%.*]] = alloca i32, align 41875// CHECK15-NEXT: [[TMP:%.*]] = alloca i32, align 41876// CHECK15-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41877// CHECK15-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41878// CHECK15-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 41879// CHECK15-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 41880// CHECK15-NEXT: [[I:%.*]] = alloca i32, align 41881// CHECK15-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 41882// CHECK15-NEXT: [[I3:%.*]] = alloca i32, align 41883// CHECK15-NEXT: store i32 100, ptr [[N]], align 41884// CHECK15-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 41885// CHECK15-NEXT: [[TMP1:%.*]] = call ptr @llvm.stacksave.p0()1886// CHECK15-NEXT: store ptr [[TMP1]], ptr [[SAVED_STACK]], align 41887// CHECK15-NEXT: [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 41888// CHECK15-NEXT: store i32 [[TMP0]], ptr [[__VLA_EXPR0]], align 41889// CHECK15-NEXT: [[TMP2:%.*]] = load i32, ptr [[N]], align 41890// CHECK15-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_]], align 41891// CHECK15-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41892// CHECK15-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 01893// CHECK15-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 11894// CHECK15-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11895// CHECK15-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41896// CHECK15-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 41897// CHECK15-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41898// CHECK15-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_UB]], align 41899// CHECK15-NEXT: store i32 0, ptr [[I]], align 41900// CHECK15-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41901// CHECK15-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]1902// CHECK15-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]1903// CHECK15: simd.if.then:1904// CHECK15-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41905// CHECK15-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 41906// CHECK15-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]1907// CHECK15: omp.inner.for.cond:1908// CHECK15-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]1909// CHECK15-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP3]]1910// CHECK15-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]1911// CHECK15-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1912// CHECK15: omp.inner.for.body:1913// CHECK15-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]1914// CHECK15-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 11915// CHECK15-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]1916// CHECK15-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP3]]1917// CHECK15-NEXT: [[TMP10:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP3]]1918// CHECK15-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i32 [[TMP10]]1919// CHECK15-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP3]]1920// CHECK15-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]1921// CHECK15: omp.body.continue:1922// CHECK15-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]1923// CHECK15: omp.inner.for.inc:1924// CHECK15-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]1925// CHECK15-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP11]], 11926// CHECK15-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]1927// CHECK15-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]1928// CHECK15: omp.inner.for.end:1929// CHECK15-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41930// CHECK15-NEXT: [[SUB6:%.*]] = sub nsw i32 [[TMP12]], 01931// CHECK15-NEXT: [[DIV7:%.*]] = sdiv i32 [[SUB6]], 11932// CHECK15-NEXT: [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 11933// CHECK15-NEXT: [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]1934// CHECK15-NEXT: store i32 [[ADD9]], ptr [[I3]], align 41935// CHECK15-NEXT: br label [[SIMD_IF_END]]1936// CHECK15: simd.if.end:1937// CHECK15-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i32 01938// CHECK15-NEXT: [[TMP13:%.*]] = load i32, ptr [[ARRAYIDX10]], align 41939// CHECK15-NEXT: [[TMP14:%.*]] = load ptr, ptr [[SAVED_STACK]], align 41940// CHECK15-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP14]])1941// CHECK15-NEXT: ret i32 [[TMP13]]1942//1943//1944// CHECK17-LABEL: define {{[^@]+}}@_Z21teams_template_structv1945// CHECK17-SAME: () #[[ATTR0:[0-9]+]] {1946// CHECK17-NEXT: entry:1947// CHECK17-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 41948// CHECK17-NEXT: [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])1949// CHECK17-NEXT: ret i32 [[CALL]]1950//1951//1952// CHECK17-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv1953// CHECK17-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat {1954// CHECK17-NEXT: entry:1955// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 81956// CHECK17-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 81957// CHECK17-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 81958// CHECK17-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 81959// CHECK17-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 81960// CHECK17-NEXT: [[TMP:%.*]] = alloca i32, align 41961// CHECK17-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 81962// CHECK17-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 81963// CHECK17-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81964// CHECK17-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 11965// CHECK17-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 01966// CHECK17-NEXT: [[TMP0:%.*]] = getelementptr float, ptr [[B]], i32 11967// CHECK17-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i641968// CHECK17-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i641969// CHECK17-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], [[TMP2]]1970// CHECK17-NEXT: [[TMP4:%.*]] = sdiv exact i64 [[TMP3]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)1971// CHECK17-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DOTOFFLOAD_SIZES]], ptr align 8 @.offload_sizes, i64 24, i1 false)1972// CHECK17-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01973// CHECK17-NEXT: store ptr [[THIS1]], ptr [[TMP5]], align 81974// CHECK17-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01975// CHECK17-NEXT: store ptr [[A]], ptr [[TMP6]], align 81976// CHECK17-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 01977// CHECK17-NEXT: store i64 [[TMP4]], ptr [[TMP7]], align 81978// CHECK17-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 01979// CHECK17-NEXT: store ptr null, ptr [[TMP8]], align 81980// CHECK17-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 11981// CHECK17-NEXT: store ptr [[THIS1]], ptr [[TMP9]], align 81982// CHECK17-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 11983// CHECK17-NEXT: store ptr [[B]], ptr [[TMP10]], align 81984// CHECK17-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 11985// CHECK17-NEXT: store ptr null, ptr [[TMP11]], align 81986// CHECK17-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 21987// CHECK17-NEXT: store ptr [[THIS1]], ptr [[TMP12]], align 81988// CHECK17-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 21989// CHECK17-NEXT: store ptr [[A]], ptr [[TMP13]], align 81990// CHECK17-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 21991// CHECK17-NEXT: store ptr null, ptr [[TMP14]], align 81992// CHECK17-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 01993// CHECK17-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 01994// CHECK17-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 01995// CHECK17-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 01996// CHECK17-NEXT: store i32 3, ptr [[TMP18]], align 41997// CHECK17-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11998// CHECK17-NEXT: store i32 3, ptr [[TMP19]], align 41999// CHECK17-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 22000// CHECK17-NEXT: store ptr [[TMP15]], ptr [[TMP20]], align 82001// CHECK17-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 32002// CHECK17-NEXT: store ptr [[TMP16]], ptr [[TMP21]], align 82003// CHECK17-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 42004// CHECK17-NEXT: store ptr [[TMP17]], ptr [[TMP22]], align 82005// CHECK17-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 52006// CHECK17-NEXT: store ptr @.offload_maptypes, ptr [[TMP23]], align 82007// CHECK17-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 62008// CHECK17-NEXT: store ptr null, ptr [[TMP24]], align 82009// CHECK17-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 72010// CHECK17-NEXT: store ptr null, ptr [[TMP25]], align 82011// CHECK17-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 82012// CHECK17-NEXT: store i64 123, ptr [[TMP26]], align 82013// CHECK17-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 92014// CHECK17-NEXT: store i64 0, ptr [[TMP27]], align 82015// CHECK17-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 102016// CHECK17-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP28]], align 42017// CHECK17-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 112018// CHECK17-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP29]], align 42019// CHECK17-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 122020// CHECK17-NEXT: store i32 0, ptr [[TMP30]], align 42021// CHECK17-NEXT: [[TMP31:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.region_id, ptr [[KERNEL_ARGS]])2022// CHECK17-NEXT: [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 02023// CHECK17-NEXT: br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]2024// CHECK17: omp_offload.failed:2025// CHECK17-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123(ptr [[THIS1]]) #[[ATTR2:[0-9]+]]2026// CHECK17-NEXT: br label [[OMP_OFFLOAD_CONT]]2027// CHECK17: omp_offload.cont:2028// CHECK17-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02029// CHECK17-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A2]], i64 0, i64 02030// CHECK17-NEXT: [[TMP33:%.*]] = load i32, ptr [[ARRAYIDX]], align 42031// CHECK17-NEXT: ret i32 [[TMP33]]2032//2033//2034// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l1232035// CHECK17-SAME: (ptr noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {2036// CHECK17-NEXT: entry:2037// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82038// CHECK17-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82039// CHECK17-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82040// CHECK17-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined, ptr [[TMP0]])2041// CHECK17-NEXT: ret void2042//2043//2044// CHECK17-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined2045// CHECK17-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]]) #[[ATTR1]] {2046// CHECK17-NEXT: entry:2047// CHECK17-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82048// CHECK17-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82049// CHECK17-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82050// CHECK17-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42051// CHECK17-NEXT: [[TMP:%.*]] = alloca i32, align 42052// CHECK17-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42053// CHECK17-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42054// CHECK17-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42055// CHECK17-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42056// CHECK17-NEXT: [[I:%.*]] = alloca i32, align 42057// CHECK17-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82058// CHECK17-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82059// CHECK17-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82060// CHECK17-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82061// CHECK17-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42062// CHECK17-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42063// CHECK17-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42064// CHECK17-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42065// CHECK17-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82066// CHECK17-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 42067// CHECK17-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2068// CHECK17-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42069// CHECK17-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 1222070// CHECK17-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2071// CHECK17: cond.true:2072// CHECK17-NEXT: br label [[COND_END:%.*]]2073// CHECK17: cond.false:2074// CHECK17-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42075// CHECK17-NEXT: br label [[COND_END]]2076// CHECK17: cond.end:2077// CHECK17-NEXT: [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]2078// CHECK17-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42079// CHECK17-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42080// CHECK17-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 42081// CHECK17-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2082// CHECK17: omp.inner.for.cond:2083// CHECK17-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4:![0-9]+]]2084// CHECK17-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP4]]2085// CHECK17-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]2086// CHECK17-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2087// CHECK17: omp.inner.for.body:2088// CHECK17-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]2089// CHECK17-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 12090// CHECK17-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2091// CHECK17-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP4]]2092// CHECK17-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 12093// CHECK17-NEXT: [[TMP9:%.*]] = load float, ptr [[B]], align 4, !llvm.access.group [[ACC_GRP4]]2094// CHECK17-NEXT: [[CONV:%.*]] = fptosi float [[TMP9]] to i322095// CHECK17-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 02096// CHECK17-NEXT: [[TMP10:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP4]]2097// CHECK17-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP10]] to i642098// CHECK17-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i64 0, i64 [[IDXPROM]]2099// CHECK17-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP4]]2100// CHECK17-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2101// CHECK17: omp.body.continue:2102// CHECK17-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2103// CHECK17: omp.inner.for.inc:2104// CHECK17-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]2105// CHECK17-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 12106// CHECK17-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]2107// CHECK17-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]]2108// CHECK17: omp.inner.for.end:2109// CHECK17-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2110// CHECK17: omp.loop.exit:2111// CHECK17-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])2112// CHECK17-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42113// CHECK17-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 02114// CHECK17-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]2115// CHECK17: .omp.final.then:2116// CHECK17-NEXT: store i32 123, ptr [[I]], align 42117// CHECK17-NEXT: br label [[DOTOMP_FINAL_DONE]]2118// CHECK17: .omp.final.done:2119// CHECK17-NEXT: ret void2120//2121//2122// CHECK19-LABEL: define {{[^@]+}}@_Z21teams_template_structv2123// CHECK19-SAME: () #[[ATTR0:[0-9]+]] {2124// CHECK19-NEXT: entry:2125// CHECK19-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42126// CHECK19-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2127// CHECK19-NEXT: ret i32 [[CALL]]2128//2129//2130// CHECK19-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2131// CHECK19-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {2132// CHECK19-NEXT: entry:2133// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42134// CHECK19-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 42135// CHECK19-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 42136// CHECK19-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 42137// CHECK19-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 42138// CHECK19-NEXT: [[TMP:%.*]] = alloca i32, align 42139// CHECK19-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 82140// CHECK19-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42141// CHECK19-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42142// CHECK19-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12143// CHECK19-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02144// CHECK19-NEXT: [[TMP0:%.*]] = getelementptr float, ptr [[B]], i32 12145// CHECK19-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i642146// CHECK19-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i642147// CHECK19-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], [[TMP2]]2148// CHECK19-NEXT: [[TMP4:%.*]] = sdiv exact i64 [[TMP3]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)2149// CHECK19-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[DOTOFFLOAD_SIZES]], ptr align 4 @.offload_sizes, i32 24, i1 false)2150// CHECK19-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02151// CHECK19-NEXT: store ptr [[THIS1]], ptr [[TMP5]], align 42152// CHECK19-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02153// CHECK19-NEXT: store ptr [[A]], ptr [[TMP6]], align 42154// CHECK19-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 02155// CHECK19-NEXT: store i64 [[TMP4]], ptr [[TMP7]], align 42156// CHECK19-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 02157// CHECK19-NEXT: store ptr null, ptr [[TMP8]], align 42158// CHECK19-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 12159// CHECK19-NEXT: store ptr [[THIS1]], ptr [[TMP9]], align 42160// CHECK19-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 12161// CHECK19-NEXT: store ptr [[B]], ptr [[TMP10]], align 42162// CHECK19-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 12163// CHECK19-NEXT: store ptr null, ptr [[TMP11]], align 42164// CHECK19-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 22165// CHECK19-NEXT: store ptr [[THIS1]], ptr [[TMP12]], align 42166// CHECK19-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 22167// CHECK19-NEXT: store ptr [[A]], ptr [[TMP13]], align 42168// CHECK19-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 22169// CHECK19-NEXT: store ptr null, ptr [[TMP14]], align 42170// CHECK19-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02171// CHECK19-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02172// CHECK19-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 02173// CHECK19-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 02174// CHECK19-NEXT: store i32 3, ptr [[TMP18]], align 42175// CHECK19-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12176// CHECK19-NEXT: store i32 3, ptr [[TMP19]], align 42177// CHECK19-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 22178// CHECK19-NEXT: store ptr [[TMP15]], ptr [[TMP20]], align 42179// CHECK19-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 32180// CHECK19-NEXT: store ptr [[TMP16]], ptr [[TMP21]], align 42181// CHECK19-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 42182// CHECK19-NEXT: store ptr [[TMP17]], ptr [[TMP22]], align 42183// CHECK19-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 52184// CHECK19-NEXT: store ptr @.offload_maptypes, ptr [[TMP23]], align 42185// CHECK19-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 62186// CHECK19-NEXT: store ptr null, ptr [[TMP24]], align 42187// CHECK19-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 72188// CHECK19-NEXT: store ptr null, ptr [[TMP25]], align 42189// CHECK19-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 82190// CHECK19-NEXT: store i64 123, ptr [[TMP26]], align 82191// CHECK19-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 92192// CHECK19-NEXT: store i64 0, ptr [[TMP27]], align 82193// CHECK19-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 102194// CHECK19-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP28]], align 42195// CHECK19-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 112196// CHECK19-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP29]], align 42197// CHECK19-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 122198// CHECK19-NEXT: store i32 0, ptr [[TMP30]], align 42199// CHECK19-NEXT: [[TMP31:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.region_id, ptr [[KERNEL_ARGS]])2200// CHECK19-NEXT: [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 02201// CHECK19-NEXT: br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]2202// CHECK19: omp_offload.failed:2203// CHECK19-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123(ptr [[THIS1]]) #[[ATTR2:[0-9]+]]2204// CHECK19-NEXT: br label [[OMP_OFFLOAD_CONT]]2205// CHECK19: omp_offload.cont:2206// CHECK19-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02207// CHECK19-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A2]], i32 0, i32 02208// CHECK19-NEXT: [[TMP33:%.*]] = load i32, ptr [[ARRAYIDX]], align 42209// CHECK19-NEXT: ret i32 [[TMP33]]2210//2211//2212// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l1232213// CHECK19-SAME: (ptr noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {2214// CHECK19-NEXT: entry:2215// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42216// CHECK19-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42217// CHECK19-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42218// CHECK19-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined, ptr [[TMP0]])2219// CHECK19-NEXT: ret void2220//2221//2222// CHECK19-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined2223// CHECK19-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]]) #[[ATTR1]] {2224// CHECK19-NEXT: entry:2225// CHECK19-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 42226// CHECK19-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 42227// CHECK19-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42228// CHECK19-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42229// CHECK19-NEXT: [[TMP:%.*]] = alloca i32, align 42230// CHECK19-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42231// CHECK19-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42232// CHECK19-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42233// CHECK19-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42234// CHECK19-NEXT: [[I:%.*]] = alloca i32, align 42235// CHECK19-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42236// CHECK19-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42237// CHECK19-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42238// CHECK19-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42239// CHECK19-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42240// CHECK19-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42241// CHECK19-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42242// CHECK19-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42243// CHECK19-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42244// CHECK19-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 42245// CHECK19-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2246// CHECK19-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42247// CHECK19-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 1222248// CHECK19-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2249// CHECK19: cond.true:2250// CHECK19-NEXT: br label [[COND_END:%.*]]2251// CHECK19: cond.false:2252// CHECK19-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42253// CHECK19-NEXT: br label [[COND_END]]2254// CHECK19: cond.end:2255// CHECK19-NEXT: [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]2256// CHECK19-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42257// CHECK19-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42258// CHECK19-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 42259// CHECK19-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2260// CHECK19: omp.inner.for.cond:2261// CHECK19-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5:![0-9]+]]2262// CHECK19-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP5]]2263// CHECK19-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]2264// CHECK19-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2265// CHECK19: omp.inner.for.body:2266// CHECK19-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]2267// CHECK19-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 12268// CHECK19-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2269// CHECK19-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP5]]2270// CHECK19-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 12271// CHECK19-NEXT: [[TMP9:%.*]] = load float, ptr [[B]], align 4, !llvm.access.group [[ACC_GRP5]]2272// CHECK19-NEXT: [[CONV:%.*]] = fptosi float [[TMP9]] to i322273// CHECK19-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 02274// CHECK19-NEXT: [[TMP10:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP5]]2275// CHECK19-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i32 0, i32 [[TMP10]]2276// CHECK19-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP5]]2277// CHECK19-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2278// CHECK19: omp.body.continue:2279// CHECK19-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2280// CHECK19: omp.inner.for.inc:2281// CHECK19-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]2282// CHECK19-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP11]], 12283// CHECK19-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]2284// CHECK19-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]2285// CHECK19: omp.inner.for.end:2286// CHECK19-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2287// CHECK19: omp.loop.exit:2288// CHECK19-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])2289// CHECK19-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42290// CHECK19-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 02291// CHECK19-NEXT: br i1 [[TMP13]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]2292// CHECK19: .omp.final.then:2293// CHECK19-NEXT: store i32 123, ptr [[I]], align 42294// CHECK19-NEXT: br label [[DOTOMP_FINAL_DONE]]2295// CHECK19: .omp.final.done:2296// CHECK19-NEXT: ret void2297//2298//2299// CHECK21-LABEL: define {{[^@]+}}@_Z21teams_template_structv2300// CHECK21-SAME: () #[[ATTR0:[0-9]+]] {2301// CHECK21-NEXT: entry:2302// CHECK21-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42303// CHECK21-NEXT: [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2304// CHECK21-NEXT: ret i32 [[CALL]]2305//2306//2307// CHECK21-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2308// CHECK21-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat {2309// CHECK21-NEXT: entry:2310// CHECK21-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82311// CHECK21-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 82312// CHECK21-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 82313// CHECK21-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 82314// CHECK21-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 82315// CHECK21-NEXT: [[TMP:%.*]] = alloca i32, align 42316// CHECK21-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 82317// CHECK21-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82318// CHECK21-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82319// CHECK21-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12320// CHECK21-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02321// CHECK21-NEXT: [[TMP0:%.*]] = getelementptr float, ptr [[B]], i32 12322// CHECK21-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i642323// CHECK21-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i642324// CHECK21-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], [[TMP2]]2325// CHECK21-NEXT: [[TMP4:%.*]] = sdiv exact i64 [[TMP3]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)2326// CHECK21-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DOTOFFLOAD_SIZES]], ptr align 8 @.offload_sizes, i64 24, i1 false)2327// CHECK21-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02328// CHECK21-NEXT: store ptr [[THIS1]], ptr [[TMP5]], align 82329// CHECK21-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02330// CHECK21-NEXT: store ptr [[A]], ptr [[TMP6]], align 82331// CHECK21-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 02332// CHECK21-NEXT: store i64 [[TMP4]], ptr [[TMP7]], align 82333// CHECK21-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 02334// CHECK21-NEXT: store ptr null, ptr [[TMP8]], align 82335// CHECK21-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 12336// CHECK21-NEXT: store ptr [[THIS1]], ptr [[TMP9]], align 82337// CHECK21-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 12338// CHECK21-NEXT: store ptr [[B]], ptr [[TMP10]], align 82339// CHECK21-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 12340// CHECK21-NEXT: store ptr null, ptr [[TMP11]], align 82341// CHECK21-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 22342// CHECK21-NEXT: store ptr [[THIS1]], ptr [[TMP12]], align 82343// CHECK21-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 22344// CHECK21-NEXT: store ptr [[A]], ptr [[TMP13]], align 82345// CHECK21-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 22346// CHECK21-NEXT: store ptr null, ptr [[TMP14]], align 82347// CHECK21-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02348// CHECK21-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02349// CHECK21-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 02350// CHECK21-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 02351// CHECK21-NEXT: store i32 3, ptr [[TMP18]], align 42352// CHECK21-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12353// CHECK21-NEXT: store i32 3, ptr [[TMP19]], align 42354// CHECK21-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 22355// CHECK21-NEXT: store ptr [[TMP15]], ptr [[TMP20]], align 82356// CHECK21-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 32357// CHECK21-NEXT: store ptr [[TMP16]], ptr [[TMP21]], align 82358// CHECK21-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 42359// CHECK21-NEXT: store ptr [[TMP17]], ptr [[TMP22]], align 82360// CHECK21-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 52361// CHECK21-NEXT: store ptr @.offload_maptypes, ptr [[TMP23]], align 82362// CHECK21-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 62363// CHECK21-NEXT: store ptr null, ptr [[TMP24]], align 82364// CHECK21-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 72365// CHECK21-NEXT: store ptr null, ptr [[TMP25]], align 82366// CHECK21-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 82367// CHECK21-NEXT: store i64 123, ptr [[TMP26]], align 82368// CHECK21-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 92369// CHECK21-NEXT: store i64 0, ptr [[TMP27]], align 82370// CHECK21-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 102371// CHECK21-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP28]], align 42372// CHECK21-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 112373// CHECK21-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP29]], align 42374// CHECK21-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 122375// CHECK21-NEXT: store i32 0, ptr [[TMP30]], align 42376// CHECK21-NEXT: [[TMP31:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.region_id, ptr [[KERNEL_ARGS]])2377// CHECK21-NEXT: [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 02378// CHECK21-NEXT: br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]2379// CHECK21: omp_offload.failed:2380// CHECK21-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123(ptr [[THIS1]]) #[[ATTR2:[0-9]+]]2381// CHECK21-NEXT: br label [[OMP_OFFLOAD_CONT]]2382// CHECK21: omp_offload.cont:2383// CHECK21-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02384// CHECK21-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A2]], i64 0, i64 02385// CHECK21-NEXT: [[TMP33:%.*]] = load i32, ptr [[ARRAYIDX]], align 42386// CHECK21-NEXT: ret i32 [[TMP33]]2387//2388//2389// CHECK21-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l1232390// CHECK21-SAME: (ptr noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {2391// CHECK21-NEXT: entry:2392// CHECK21-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82393// CHECK21-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 12394// CHECK21-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 82395// CHECK21-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82396// CHECK21-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82397// CHECK21-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 12398// CHECK21-NEXT: [[TMP1:%.*]] = load float, ptr [[B]], align 42399// CHECK21-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP1]], 0.000000e+002400// CHECK21-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i82401// CHECK21-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 12402// CHECK21-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 12403// CHECK21-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i12404// CHECK21-NEXT: [[STOREDV1:%.*]] = zext i1 [[LOADEDV]] to i82405// CHECK21-NEXT: store i8 [[STOREDV1]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 12406// CHECK21-NEXT: [[TMP3:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR__CASTED]], align 82407// CHECK21-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined, ptr [[TMP0]], i64 [[TMP3]])2408// CHECK21-NEXT: ret void2409//2410//2411// CHECK21-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined2412// CHECK21-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {2413// CHECK21-NEXT: entry:2414// CHECK21-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82415// CHECK21-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82416// CHECK21-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82417// CHECK21-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 82418// CHECK21-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42419// CHECK21-NEXT: [[TMP:%.*]] = alloca i32, align 42420// CHECK21-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42421// CHECK21-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42422// CHECK21-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42423// CHECK21-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42424// CHECK21-NEXT: [[I:%.*]] = alloca i32, align 42425// CHECK21-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82426// CHECK21-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82427// CHECK21-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82428// CHECK21-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 82429// CHECK21-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82430// CHECK21-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42431// CHECK21-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42432// CHECK21-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42433// CHECK21-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42434// CHECK21-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82435// CHECK21-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 42436// CHECK21-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2437// CHECK21-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42438// CHECK21-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 1222439// CHECK21-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2440// CHECK21: cond.true:2441// CHECK21-NEXT: br label [[COND_END:%.*]]2442// CHECK21: cond.false:2443// CHECK21-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42444// CHECK21-NEXT: br label [[COND_END]]2445// CHECK21: cond.end:2446// CHECK21-NEXT: [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]2447// CHECK21-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42448// CHECK21-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42449// CHECK21-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 42450// CHECK21-NEXT: [[TMP6:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 12451// CHECK21-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP6]] to i12452// CHECK21-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]2453// CHECK21: omp_if.then:2454// CHECK21-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2455// CHECK21: omp.inner.for.cond:2456// CHECK21-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4:![0-9]+]]2457// CHECK21-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP4]]2458// CHECK21-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]2459// CHECK21-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2460// CHECK21: omp.inner.for.body:2461// CHECK21-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]2462// CHECK21-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 12463// CHECK21-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2464// CHECK21-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP4]]2465// CHECK21-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 12466// CHECK21-NEXT: [[TMP10:%.*]] = load float, ptr [[B]], align 4, !nontemporal [[META5:![0-9]+]], !llvm.access.group [[ACC_GRP4]]2467// CHECK21-NEXT: [[CONV:%.*]] = fptosi float [[TMP10]] to i322468// CHECK21-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 02469// CHECK21-NEXT: [[TMP11:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP4]]2470// CHECK21-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i642471// CHECK21-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i64 0, i64 [[IDXPROM]]2472// CHECK21-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP4]]2473// CHECK21-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2474// CHECK21: omp.body.continue:2475// CHECK21-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2476// CHECK21: omp.inner.for.inc:2477// CHECK21-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]2478// CHECK21-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP12]], 12479// CHECK21-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP4]]2480// CHECK21-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]2481// CHECK21: omp.inner.for.end:2482// CHECK21-NEXT: br label [[OMP_IF_END:%.*]]2483// CHECK21: omp_if.else:2484// CHECK21-NEXT: br label [[OMP_INNER_FOR_COND3:%.*]]2485// CHECK21: omp.inner.for.cond3:2486// CHECK21-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42487// CHECK21-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42488// CHECK21-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]2489// CHECK21-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY5:%.*]], label [[OMP_INNER_FOR_END16:%.*]]2490// CHECK21: omp.inner.for.body5:2491// CHECK21-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42492// CHECK21-NEXT: [[MUL6:%.*]] = mul nsw i32 [[TMP15]], 12493// CHECK21-NEXT: [[ADD7:%.*]] = add nsw i32 0, [[MUL6]]2494// CHECK21-NEXT: store i32 [[ADD7]], ptr [[I]], align 42495// CHECK21-NEXT: [[B8:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 12496// CHECK21-NEXT: [[TMP16:%.*]] = load float, ptr [[B8]], align 42497// CHECK21-NEXT: [[CONV9:%.*]] = fptosi float [[TMP16]] to i322498// CHECK21-NEXT: [[A10:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 02499// CHECK21-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 42500// CHECK21-NEXT: [[IDXPROM11:%.*]] = sext i32 [[TMP17]] to i642501// CHECK21-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds [123 x i32], ptr [[A10]], i64 0, i64 [[IDXPROM11]]2502// CHECK21-NEXT: store i32 [[CONV9]], ptr [[ARRAYIDX12]], align 42503// CHECK21-NEXT: br label [[OMP_BODY_CONTINUE13:%.*]]2504// CHECK21: omp.body.continue13:2505// CHECK21-NEXT: br label [[OMP_INNER_FOR_INC14:%.*]]2506// CHECK21: omp.inner.for.inc14:2507// CHECK21-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42508// CHECK21-NEXT: [[ADD15:%.*]] = add nsw i32 [[TMP18]], 12509// CHECK21-NEXT: store i32 [[ADD15]], ptr [[DOTOMP_IV]], align 42510// CHECK21-NEXT: br label [[OMP_INNER_FOR_COND3]], !llvm.loop [[LOOP9:![0-9]+]]2511// CHECK21: omp.inner.for.end16:2512// CHECK21-NEXT: br label [[OMP_IF_END]]2513// CHECK21: omp_if.end:2514// CHECK21-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2515// CHECK21: omp.loop.exit:2516// CHECK21-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])2517// CHECK21-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42518// CHECK21-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 02519// CHECK21-NEXT: br i1 [[TMP20]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]2520// CHECK21: .omp.final.then:2521// CHECK21-NEXT: store i32 123, ptr [[I]], align 42522// CHECK21-NEXT: br label [[DOTOMP_FINAL_DONE]]2523// CHECK21: .omp.final.done:2524// CHECK21-NEXT: ret void2525//2526//2527// CHECK23-LABEL: define {{[^@]+}}@_Z21teams_template_structv2528// CHECK23-SAME: () #[[ATTR0:[0-9]+]] {2529// CHECK23-NEXT: entry:2530// CHECK23-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42531// CHECK23-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2532// CHECK23-NEXT: ret i32 [[CALL]]2533//2534//2535// CHECK23-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2536// CHECK23-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {2537// CHECK23-NEXT: entry:2538// CHECK23-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42539// CHECK23-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 42540// CHECK23-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 42541// CHECK23-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 42542// CHECK23-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 42543// CHECK23-NEXT: [[TMP:%.*]] = alloca i32, align 42544// CHECK23-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 82545// CHECK23-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42546// CHECK23-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42547// CHECK23-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12548// CHECK23-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02549// CHECK23-NEXT: [[TMP0:%.*]] = getelementptr float, ptr [[B]], i32 12550// CHECK23-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i642551// CHECK23-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i642552// CHECK23-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], [[TMP2]]2553// CHECK23-NEXT: [[TMP4:%.*]] = sdiv exact i64 [[TMP3]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)2554// CHECK23-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[DOTOFFLOAD_SIZES]], ptr align 4 @.offload_sizes, i32 24, i1 false)2555// CHECK23-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02556// CHECK23-NEXT: store ptr [[THIS1]], ptr [[TMP5]], align 42557// CHECK23-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02558// CHECK23-NEXT: store ptr [[A]], ptr [[TMP6]], align 42559// CHECK23-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 02560// CHECK23-NEXT: store i64 [[TMP4]], ptr [[TMP7]], align 42561// CHECK23-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 02562// CHECK23-NEXT: store ptr null, ptr [[TMP8]], align 42563// CHECK23-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 12564// CHECK23-NEXT: store ptr [[THIS1]], ptr [[TMP9]], align 42565// CHECK23-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 12566// CHECK23-NEXT: store ptr [[B]], ptr [[TMP10]], align 42567// CHECK23-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 12568// CHECK23-NEXT: store ptr null, ptr [[TMP11]], align 42569// CHECK23-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 22570// CHECK23-NEXT: store ptr [[THIS1]], ptr [[TMP12]], align 42571// CHECK23-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 22572// CHECK23-NEXT: store ptr [[A]], ptr [[TMP13]], align 42573// CHECK23-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 22574// CHECK23-NEXT: store ptr null, ptr [[TMP14]], align 42575// CHECK23-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 02576// CHECK23-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 02577// CHECK23-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 02578// CHECK23-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 02579// CHECK23-NEXT: store i32 3, ptr [[TMP18]], align 42580// CHECK23-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12581// CHECK23-NEXT: store i32 3, ptr [[TMP19]], align 42582// CHECK23-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 22583// CHECK23-NEXT: store ptr [[TMP15]], ptr [[TMP20]], align 42584// CHECK23-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 32585// CHECK23-NEXT: store ptr [[TMP16]], ptr [[TMP21]], align 42586// CHECK23-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 42587// CHECK23-NEXT: store ptr [[TMP17]], ptr [[TMP22]], align 42588// CHECK23-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 52589// CHECK23-NEXT: store ptr @.offload_maptypes, ptr [[TMP23]], align 42590// CHECK23-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 62591// CHECK23-NEXT: store ptr null, ptr [[TMP24]], align 42592// CHECK23-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 72593// CHECK23-NEXT: store ptr null, ptr [[TMP25]], align 42594// CHECK23-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 82595// CHECK23-NEXT: store i64 123, ptr [[TMP26]], align 82596// CHECK23-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 92597// CHECK23-NEXT: store i64 0, ptr [[TMP27]], align 82598// CHECK23-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 102599// CHECK23-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP28]], align 42600// CHECK23-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 112601// CHECK23-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP29]], align 42602// CHECK23-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 122603// CHECK23-NEXT: store i32 0, ptr [[TMP30]], align 42604// CHECK23-NEXT: [[TMP31:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.region_id, ptr [[KERNEL_ARGS]])2605// CHECK23-NEXT: [[TMP32:%.*]] = icmp ne i32 [[TMP31]], 02606// CHECK23-NEXT: br i1 [[TMP32]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]2607// CHECK23: omp_offload.failed:2608// CHECK23-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123(ptr [[THIS1]]) #[[ATTR2:[0-9]+]]2609// CHECK23-NEXT: br label [[OMP_OFFLOAD_CONT]]2610// CHECK23: omp_offload.cont:2611// CHECK23-NEXT: [[A2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02612// CHECK23-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A2]], i32 0, i32 02613// CHECK23-NEXT: [[TMP33:%.*]] = load i32, ptr [[ARRAYIDX]], align 42614// CHECK23-NEXT: ret i32 [[TMP33]]2615//2616//2617// CHECK23-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l1232618// CHECK23-SAME: (ptr noundef [[THIS:%.*]]) #[[ATTR1:[0-9]+]] {2619// CHECK23-NEXT: entry:2620// CHECK23-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42621// CHECK23-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 12622// CHECK23-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 42623// CHECK23-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42624// CHECK23-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42625// CHECK23-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 12626// CHECK23-NEXT: [[TMP1:%.*]] = load float, ptr [[B]], align 42627// CHECK23-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP1]], 0.000000e+002628// CHECK23-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i82629// CHECK23-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 12630// CHECK23-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 12631// CHECK23-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i12632// CHECK23-NEXT: [[STOREDV1:%.*]] = zext i1 [[LOADEDV]] to i82633// CHECK23-NEXT: store i8 [[STOREDV1]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 12634// CHECK23-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__CASTED]], align 42635// CHECK23-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 2, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined, ptr [[TMP0]], i32 [[TMP3]])2636// CHECK23-NEXT: ret void2637//2638//2639// CHECK23-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SSIiLi123ELx456EE3fooEv_l123.omp_outlined2640// CHECK23-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef [[THIS:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR1]] {2641// CHECK23-NEXT: entry:2642// CHECK23-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 42643// CHECK23-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 42644// CHECK23-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42645// CHECK23-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 42646// CHECK23-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42647// CHECK23-NEXT: [[TMP:%.*]] = alloca i32, align 42648// CHECK23-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42649// CHECK23-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42650// CHECK23-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42651// CHECK23-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42652// CHECK23-NEXT: [[I:%.*]] = alloca i32, align 42653// CHECK23-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42654// CHECK23-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42655// CHECK23-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42656// CHECK23-NEXT: store i32 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 42657// CHECK23-NEXT: [[TMP0:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42658// CHECK23-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42659// CHECK23-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42660// CHECK23-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 42661// CHECK23-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 42662// CHECK23-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 42663// CHECK23-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 42664// CHECK23-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2665// CHECK23-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42666// CHECK23-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 1222667// CHECK23-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2668// CHECK23: cond.true:2669// CHECK23-NEXT: br label [[COND_END:%.*]]2670// CHECK23: cond.false:2671// CHECK23-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42672// CHECK23-NEXT: br label [[COND_END]]2673// CHECK23: cond.end:2674// CHECK23-NEXT: [[COND:%.*]] = phi i32 [ 122, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]2675// CHECK23-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 42676// CHECK23-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42677// CHECK23-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 42678// CHECK23-NEXT: [[TMP6:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 12679// CHECK23-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP6]] to i12680// CHECK23-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]2681// CHECK23: omp_if.then:2682// CHECK23-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2683// CHECK23: omp.inner.for.cond:2684// CHECK23-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5:![0-9]+]]2685// CHECK23-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP5]]2686// CHECK23-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]2687// CHECK23-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2688// CHECK23: omp.inner.for.body:2689// CHECK23-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]2690// CHECK23-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 12691// CHECK23-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2692// CHECK23-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP5]]2693// CHECK23-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[TMP0]], i32 0, i32 12694// CHECK23-NEXT: [[TMP10:%.*]] = load float, ptr [[B]], align 4, !nontemporal [[META6:![0-9]+]], !llvm.access.group [[ACC_GRP5]]2695// CHECK23-NEXT: [[CONV:%.*]] = fptosi float [[TMP10]] to i322696// CHECK23-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 02697// CHECK23-NEXT: [[TMP11:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP5]]2698// CHECK23-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i32 0, i32 [[TMP11]]2699// CHECK23-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP5]]2700// CHECK23-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2701// CHECK23: omp.body.continue:2702// CHECK23-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2703// CHECK23: omp.inner.for.inc:2704// CHECK23-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]2705// CHECK23-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP12]], 12706// CHECK23-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]2707// CHECK23-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]2708// CHECK23: omp.inner.for.end:2709// CHECK23-NEXT: br label [[OMP_IF_END:%.*]]2710// CHECK23: omp_if.else:2711// CHECK23-NEXT: br label [[OMP_INNER_FOR_COND3:%.*]]2712// CHECK23: omp.inner.for.cond3:2713// CHECK23-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42714// CHECK23-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42715// CHECK23-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]2716// CHECK23-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY5:%.*]], label [[OMP_INNER_FOR_END15:%.*]]2717// CHECK23: omp.inner.for.body5:2718// CHECK23-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42719// CHECK23-NEXT: [[MUL6:%.*]] = mul nsw i32 [[TMP15]], 12720// CHECK23-NEXT: [[ADD7:%.*]] = add nsw i32 0, [[MUL6]]2721// CHECK23-NEXT: store i32 [[ADD7]], ptr [[I]], align 42722// CHECK23-NEXT: [[B8:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 12723// CHECK23-NEXT: [[TMP16:%.*]] = load float, ptr [[B8]], align 42724// CHECK23-NEXT: [[CONV9:%.*]] = fptosi float [[TMP16]] to i322725// CHECK23-NEXT: [[A10:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[TMP0]], i32 0, i32 02726// CHECK23-NEXT: [[TMP17:%.*]] = load i32, ptr [[I]], align 42727// CHECK23-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [123 x i32], ptr [[A10]], i32 0, i32 [[TMP17]]2728// CHECK23-NEXT: store i32 [[CONV9]], ptr [[ARRAYIDX11]], align 42729// CHECK23-NEXT: br label [[OMP_BODY_CONTINUE12:%.*]]2730// CHECK23: omp.body.continue12:2731// CHECK23-NEXT: br label [[OMP_INNER_FOR_INC13:%.*]]2732// CHECK23: omp.inner.for.inc13:2733// CHECK23-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42734// CHECK23-NEXT: [[ADD14:%.*]] = add nsw i32 [[TMP18]], 12735// CHECK23-NEXT: store i32 [[ADD14]], ptr [[DOTOMP_IV]], align 42736// CHECK23-NEXT: br label [[OMP_INNER_FOR_COND3]], !llvm.loop [[LOOP10:![0-9]+]]2737// CHECK23: omp.inner.for.end15:2738// CHECK23-NEXT: br label [[OMP_IF_END]]2739// CHECK23: omp_if.end:2740// CHECK23-NEXT: br label [[OMP_LOOP_EXIT:%.*]]2741// CHECK23: omp.loop.exit:2742// CHECK23-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])2743// CHECK23-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 42744// CHECK23-NEXT: [[TMP20:%.*]] = icmp ne i32 [[TMP19]], 02745// CHECK23-NEXT: br i1 [[TMP20]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]2746// CHECK23: .omp.final.then:2747// CHECK23-NEXT: store i32 123, ptr [[I]], align 42748// CHECK23-NEXT: br label [[DOTOMP_FINAL_DONE]]2749// CHECK23: .omp.final.done:2750// CHECK23-NEXT: ret void2751//2752//2753// CHECK25-LABEL: define {{[^@]+}}@_Z21teams_template_structv2754// CHECK25-SAME: () #[[ATTR0:[0-9]+]] {2755// CHECK25-NEXT: entry:2756// CHECK25-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42757// CHECK25-NEXT: [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2758// CHECK25-NEXT: ret i32 [[CALL]]2759//2760//2761// CHECK25-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2762// CHECK25-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat {2763// CHECK25-NEXT: entry:2764// CHECK25-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82765// CHECK25-NEXT: [[TMP:%.*]] = alloca i32, align 42766// CHECK25-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42767// CHECK25-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42768// CHECK25-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42769// CHECK25-NEXT: [[I:%.*]] = alloca i32, align 42770// CHECK25-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82771// CHECK25-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82772// CHECK25-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42773// CHECK25-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42774// CHECK25-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42775// CHECK25-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_IV]], align 42776// CHECK25-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2777// CHECK25: omp.inner.for.cond:2778// CHECK25-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]2779// CHECK25-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP2]]2780// CHECK25-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]2781// CHECK25-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2782// CHECK25: omp.inner.for.body:2783// CHECK25-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]2784// CHECK25-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP3]], 12785// CHECK25-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2786// CHECK25-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP2]]2787// CHECK25-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12788// CHECK25-NEXT: [[TMP4:%.*]] = load float, ptr [[B]], align 4, !llvm.access.group [[ACC_GRP2]]2789// CHECK25-NEXT: [[CONV:%.*]] = fptosi float [[TMP4]] to i322790// CHECK25-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02791// CHECK25-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP2]]2792// CHECK25-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP5]] to i642793// CHECK25-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i64 0, i64 [[IDXPROM]]2794// CHECK25-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP2]]2795// CHECK25-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2796// CHECK25: omp.body.continue:2797// CHECK25-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2798// CHECK25: omp.inner.for.inc:2799// CHECK25-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]2800// CHECK25-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP6]], 12801// CHECK25-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]2802// CHECK25-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]2803// CHECK25: omp.inner.for.end:2804// CHECK25-NEXT: store i32 123, ptr [[I]], align 42805// CHECK25-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02806// CHECK25-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds [123 x i32], ptr [[A3]], i64 0, i64 02807// CHECK25-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX4]], align 42808// CHECK25-NEXT: ret i32 [[TMP7]]2809//2810//2811// CHECK27-LABEL: define {{[^@]+}}@_Z21teams_template_structv2812// CHECK27-SAME: () #[[ATTR0:[0-9]+]] {2813// CHECK27-NEXT: entry:2814// CHECK27-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42815// CHECK27-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2816// CHECK27-NEXT: ret i32 [[CALL]]2817//2818//2819// CHECK27-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2820// CHECK27-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {2821// CHECK27-NEXT: entry:2822// CHECK27-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42823// CHECK27-NEXT: [[TMP:%.*]] = alloca i32, align 42824// CHECK27-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42825// CHECK27-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42826// CHECK27-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42827// CHECK27-NEXT: [[I:%.*]] = alloca i32, align 42828// CHECK27-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42829// CHECK27-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42830// CHECK27-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42831// CHECK27-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42832// CHECK27-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42833// CHECK27-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_IV]], align 42834// CHECK27-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2835// CHECK27: omp.inner.for.cond:2836// CHECK27-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]2837// CHECK27-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP3]]2838// CHECK27-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]2839// CHECK27-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2840// CHECK27: omp.inner.for.body:2841// CHECK27-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]2842// CHECK27-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP3]], 12843// CHECK27-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2844// CHECK27-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP3]]2845// CHECK27-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12846// CHECK27-NEXT: [[TMP4:%.*]] = load float, ptr [[B]], align 4, !llvm.access.group [[ACC_GRP3]]2847// CHECK27-NEXT: [[CONV:%.*]] = fptosi float [[TMP4]] to i322848// CHECK27-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02849// CHECK27-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP3]]2850// CHECK27-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i32 0, i32 [[TMP5]]2851// CHECK27-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP3]]2852// CHECK27-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2853// CHECK27: omp.body.continue:2854// CHECK27-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2855// CHECK27: omp.inner.for.inc:2856// CHECK27-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]2857// CHECK27-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP6]], 12858// CHECK27-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]2859// CHECK27-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]2860// CHECK27: omp.inner.for.end:2861// CHECK27-NEXT: store i32 123, ptr [[I]], align 42862// CHECK27-NEXT: [[A3:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02863// CHECK27-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds [123 x i32], ptr [[A3]], i32 0, i32 02864// CHECK27-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX4]], align 42865// CHECK27-NEXT: ret i32 [[TMP7]]2866//2867//2868// CHECK29-LABEL: define {{[^@]+}}@_Z21teams_template_structv2869// CHECK29-SAME: () #[[ATTR0:[0-9]+]] {2870// CHECK29-NEXT: entry:2871// CHECK29-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42872// CHECK29-NEXT: [[CALL:%.*]] = call noundef signext i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2873// CHECK29-NEXT: ret i32 [[CALL]]2874//2875//2876// CHECK29-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2877// CHECK29-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat {2878// CHECK29-NEXT: entry:2879// CHECK29-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 82880// CHECK29-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 12881// CHECK29-NEXT: [[TMP:%.*]] = alloca i32, align 42882// CHECK29-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42883// CHECK29-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42884// CHECK29-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42885// CHECK29-NEXT: [[I:%.*]] = alloca i32, align 42886// CHECK29-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 82887// CHECK29-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82888// CHECK29-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12889// CHECK29-NEXT: [[TMP0:%.*]] = load float, ptr [[B]], align 42890// CHECK29-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP0]], 0.000000e+002891// CHECK29-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i82892// CHECK29-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 12893// CHECK29-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42894// CHECK29-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42895// CHECK29-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42896// CHECK29-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_IV]], align 42897// CHECK29-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 12898// CHECK29-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i12899// CHECK29-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]2900// CHECK29: omp_if.then:2901// CHECK29-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]2902// CHECK29: omp.inner.for.cond:2903// CHECK29-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]2904// CHECK29-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP2]]2905// CHECK29-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP3]], [[TMP4]]2906// CHECK29-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2907// CHECK29: omp.inner.for.body:2908// CHECK29-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]2909// CHECK29-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP5]], 12910// CHECK29-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]2911// CHECK29-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP2]]2912// CHECK29-NEXT: [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 12913// CHECK29-NEXT: [[TMP6:%.*]] = load float, ptr [[B2]], align 4, !nontemporal [[META3:![0-9]+]], !llvm.access.group [[ACC_GRP2]]2914// CHECK29-NEXT: [[CONV:%.*]] = fptosi float [[TMP6]] to i322915// CHECK29-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02916// CHECK29-NEXT: [[TMP7:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP2]]2917// CHECK29-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP7]] to i642918// CHECK29-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i64 0, i64 [[IDXPROM]]2919// CHECK29-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP2]]2920// CHECK29-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]2921// CHECK29: omp.body.continue:2922// CHECK29-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]2923// CHECK29: omp.inner.for.inc:2924// CHECK29-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]2925// CHECK29-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], 12926// CHECK29-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]2927// CHECK29-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]2928// CHECK29: omp.inner.for.end:2929// CHECK29-NEXT: br label [[OMP_IF_END:%.*]]2930// CHECK29: omp_if.else:2931// CHECK29-NEXT: br label [[OMP_INNER_FOR_COND4:%.*]]2932// CHECK29: omp.inner.for.cond4:2933// CHECK29-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42934// CHECK29-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42935// CHECK29-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]2936// CHECK29-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY6:%.*]], label [[OMP_INNER_FOR_END17:%.*]]2937// CHECK29: omp.inner.for.body6:2938// CHECK29-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42939// CHECK29-NEXT: [[MUL7:%.*]] = mul nsw i32 [[TMP11]], 12940// CHECK29-NEXT: [[ADD8:%.*]] = add nsw i32 0, [[MUL7]]2941// CHECK29-NEXT: store i32 [[ADD8]], ptr [[I]], align 42942// CHECK29-NEXT: [[B9:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 12943// CHECK29-NEXT: [[TMP12:%.*]] = load float, ptr [[B9]], align 42944// CHECK29-NEXT: [[CONV10:%.*]] = fptosi float [[TMP12]] to i322945// CHECK29-NEXT: [[A11:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02946// CHECK29-NEXT: [[TMP13:%.*]] = load i32, ptr [[I]], align 42947// CHECK29-NEXT: [[IDXPROM12:%.*]] = sext i32 [[TMP13]] to i642948// CHECK29-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds [123 x i32], ptr [[A11]], i64 0, i64 [[IDXPROM12]]2949// CHECK29-NEXT: store i32 [[CONV10]], ptr [[ARRAYIDX13]], align 42950// CHECK29-NEXT: br label [[OMP_BODY_CONTINUE14:%.*]]2951// CHECK29: omp.body.continue14:2952// CHECK29-NEXT: br label [[OMP_INNER_FOR_INC15:%.*]]2953// CHECK29: omp.inner.for.inc15:2954// CHECK29-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42955// CHECK29-NEXT: [[ADD16:%.*]] = add nsw i32 [[TMP14]], 12956// CHECK29-NEXT: store i32 [[ADD16]], ptr [[DOTOMP_IV]], align 42957// CHECK29-NEXT: br label [[OMP_INNER_FOR_COND4]], !llvm.loop [[LOOP7:![0-9]+]]2958// CHECK29: omp.inner.for.end17:2959// CHECK29-NEXT: br label [[OMP_IF_END]]2960// CHECK29: omp_if.end:2961// CHECK29-NEXT: store i32 123, ptr [[I]], align 42962// CHECK29-NEXT: [[A18:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 02963// CHECK29-NEXT: [[ARRAYIDX19:%.*]] = getelementptr inbounds [123 x i32], ptr [[A18]], i64 0, i64 02964// CHECK29-NEXT: [[TMP15:%.*]] = load i32, ptr [[ARRAYIDX19]], align 42965// CHECK29-NEXT: ret i32 [[TMP15]]2966//2967//2968// CHECK31-LABEL: define {{[^@]+}}@_Z21teams_template_structv2969// CHECK31-SAME: () #[[ATTR0:[0-9]+]] {2970// CHECK31-NEXT: entry:2971// CHECK31-NEXT: [[V:%.*]] = alloca [[STRUCT_SS:%.*]], align 42972// CHECK31-NEXT: [[CALL:%.*]] = call noundef i32 @_ZN2SSIiLi123ELx456EE3fooEv(ptr noundef nonnull align 4 dereferenceable(496) [[V]])2973// CHECK31-NEXT: ret i32 [[CALL]]2974//2975//2976// CHECK31-LABEL: define {{[^@]+}}@_ZN2SSIiLi123ELx456EE3fooEv2977// CHECK31-SAME: (ptr noundef nonnull align 4 dereferenceable(496) [[THIS:%.*]]) #[[ATTR0]] comdat align 2 {2978// CHECK31-NEXT: entry:2979// CHECK31-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 42980// CHECK31-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 12981// CHECK31-NEXT: [[TMP:%.*]] = alloca i32, align 42982// CHECK31-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 42983// CHECK31-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 42984// CHECK31-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 42985// CHECK31-NEXT: [[I:%.*]] = alloca i32, align 42986// CHECK31-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 42987// CHECK31-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 42988// CHECK31-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_SS:%.*]], ptr [[THIS1]], i32 0, i32 12989// CHECK31-NEXT: [[TMP0:%.*]] = load float, ptr [[B]], align 42990// CHECK31-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP0]], 0.000000e+002991// CHECK31-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i82992// CHECK31-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 12993// CHECK31-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 42994// CHECK31-NEXT: store i32 122, ptr [[DOTOMP_UB]], align 42995// CHECK31-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42996// CHECK31-NEXT: store i32 [[TMP1]], ptr [[DOTOMP_IV]], align 42997// CHECK31-NEXT: [[TMP2:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 12998// CHECK31-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP2]] to i12999// CHECK31-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]3000// CHECK31: omp_if.then:3001// CHECK31-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3002// CHECK31: omp.inner.for.cond:3003// CHECK31-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]3004// CHECK31-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP3]]3005// CHECK31-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP3]], [[TMP4]]3006// CHECK31-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3007// CHECK31: omp.inner.for.body:3008// CHECK31-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]3009// CHECK31-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP5]], 13010// CHECK31-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3011// CHECK31-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP3]]3012// CHECK31-NEXT: [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 13013// CHECK31-NEXT: [[TMP6:%.*]] = load float, ptr [[B2]], align 4, !nontemporal [[META4:![0-9]+]], !llvm.access.group [[ACC_GRP3]]3014// CHECK31-NEXT: [[CONV:%.*]] = fptosi float [[TMP6]] to i323015// CHECK31-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 03016// CHECK31-NEXT: [[TMP7:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP3]]3017// CHECK31-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [123 x i32], ptr [[A]], i32 0, i32 [[TMP7]]3018// CHECK31-NEXT: store i32 [[CONV]], ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP3]]3019// CHECK31-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3020// CHECK31: omp.body.continue:3021// CHECK31-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3022// CHECK31: omp.inner.for.inc:3023// CHECK31-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]3024// CHECK31-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP8]], 13025// CHECK31-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]3026// CHECK31-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]]3027// CHECK31: omp.inner.for.end:3028// CHECK31-NEXT: br label [[OMP_IF_END:%.*]]3029// CHECK31: omp_if.else:3030// CHECK31-NEXT: br label [[OMP_INNER_FOR_COND4:%.*]]3031// CHECK31: omp.inner.for.cond4:3032// CHECK31-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43033// CHECK31-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43034// CHECK31-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]3035// CHECK31-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY6:%.*]], label [[OMP_INNER_FOR_END16:%.*]]3036// CHECK31: omp.inner.for.body6:3037// CHECK31-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43038// CHECK31-NEXT: [[MUL7:%.*]] = mul nsw i32 [[TMP11]], 13039// CHECK31-NEXT: [[ADD8:%.*]] = add nsw i32 0, [[MUL7]]3040// CHECK31-NEXT: store i32 [[ADD8]], ptr [[I]], align 43041// CHECK31-NEXT: [[B9:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 13042// CHECK31-NEXT: [[TMP12:%.*]] = load float, ptr [[B9]], align 43043// CHECK31-NEXT: [[CONV10:%.*]] = fptosi float [[TMP12]] to i323044// CHECK31-NEXT: [[A11:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 03045// CHECK31-NEXT: [[TMP13:%.*]] = load i32, ptr [[I]], align 43046// CHECK31-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds [123 x i32], ptr [[A11]], i32 0, i32 [[TMP13]]3047// CHECK31-NEXT: store i32 [[CONV10]], ptr [[ARRAYIDX12]], align 43048// CHECK31-NEXT: br label [[OMP_BODY_CONTINUE13:%.*]]3049// CHECK31: omp.body.continue13:3050// CHECK31-NEXT: br label [[OMP_INNER_FOR_INC14:%.*]]3051// CHECK31: omp.inner.for.inc14:3052// CHECK31-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 43053// CHECK31-NEXT: [[ADD15:%.*]] = add nsw i32 [[TMP14]], 13054// CHECK31-NEXT: store i32 [[ADD15]], ptr [[DOTOMP_IV]], align 43055// CHECK31-NEXT: br label [[OMP_INNER_FOR_COND4]], !llvm.loop [[LOOP8:![0-9]+]]3056// CHECK31: omp.inner.for.end16:3057// CHECK31-NEXT: br label [[OMP_IF_END]]3058// CHECK31: omp_if.end:3059// CHECK31-NEXT: store i32 123, ptr [[I]], align 43060// CHECK31-NEXT: [[A17:%.*]] = getelementptr inbounds nuw [[STRUCT_SS]], ptr [[THIS1]], i32 0, i32 03061// CHECK31-NEXT: [[ARRAYIDX18:%.*]] = getelementptr inbounds [123 x i32], ptr [[A17]], i32 0, i32 03062// CHECK31-NEXT: [[TMP15:%.*]] = load i32, ptr [[ARRAYIDX18]], align 43063// CHECK31-NEXT: ret i32 [[TMP15]]3064//3065//3066// CHECK33-LABEL: define {{[^@]+}}@main3067// CHECK33-SAME: (i32 noundef signext [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {3068// CHECK33-NEXT: entry:3069// CHECK33-NEXT: [[RETVAL:%.*]] = alloca i32, align 43070// CHECK33-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 43071// CHECK33-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 83072// CHECK33-NEXT: [[N:%.*]] = alloca i32, align 43073// CHECK33-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 83074// CHECK33-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 83075// CHECK33-NEXT: [[N_CASTED:%.*]] = alloca i64, align 83076// CHECK33-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 83077// CHECK33-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 83078// CHECK33-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 83079// CHECK33-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 83080// CHECK33-NEXT: [[TMP:%.*]] = alloca i32, align 43081// CHECK33-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 43082// CHECK33-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 43083// CHECK33-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 83084// CHECK33-NEXT: store i32 0, ptr [[RETVAL]], align 43085// CHECK33-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 43086// CHECK33-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 83087// CHECK33-NEXT: store i32 100, ptr [[N]], align 43088// CHECK33-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 43089// CHECK33-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i643090// CHECK33-NEXT: [[TMP2:%.*]] = call ptr @llvm.stacksave.p0()3091// CHECK33-NEXT: store ptr [[TMP2]], ptr [[SAVED_STACK]], align 83092// CHECK33-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 43093// CHECK33-NEXT: store i64 [[TMP1]], ptr [[__VLA_EXPR0]], align 83094// CHECK33-NEXT: [[TMP3:%.*]] = load i32, ptr [[N]], align 43095// CHECK33-NEXT: store i32 [[TMP3]], ptr [[N_CASTED]], align 43096// CHECK33-NEXT: [[TMP4:%.*]] = load i64, ptr [[N_CASTED]], align 83097// CHECK33-NEXT: [[TMP5:%.*]] = mul nuw i64 [[TMP1]], 43098// CHECK33-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DOTOFFLOAD_SIZES]], ptr align 8 @.offload_sizes, i64 24, i1 false)3099// CHECK33-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03100// CHECK33-NEXT: store i64 [[TMP4]], ptr [[TMP6]], align 83101// CHECK33-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03102// CHECK33-NEXT: store i64 [[TMP4]], ptr [[TMP7]], align 83103// CHECK33-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 03104// CHECK33-NEXT: store ptr null, ptr [[TMP8]], align 83105// CHECK33-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 13106// CHECK33-NEXT: store i64 [[TMP1]], ptr [[TMP9]], align 83107// CHECK33-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 13108// CHECK33-NEXT: store i64 [[TMP1]], ptr [[TMP10]], align 83109// CHECK33-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 13110// CHECK33-NEXT: store ptr null, ptr [[TMP11]], align 83111// CHECK33-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 23112// CHECK33-NEXT: store ptr [[VLA]], ptr [[TMP12]], align 83113// CHECK33-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 23114// CHECK33-NEXT: store ptr [[VLA]], ptr [[TMP13]], align 83115// CHECK33-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 23116// CHECK33-NEXT: store i64 [[TMP5]], ptr [[TMP14]], align 83117// CHECK33-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 23118// CHECK33-NEXT: store ptr null, ptr [[TMP15]], align 83119// CHECK33-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03120// CHECK33-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03121// CHECK33-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 03122// CHECK33-NEXT: [[TMP19:%.*]] = load i32, ptr [[N]], align 43123// CHECK33-NEXT: store i32 [[TMP19]], ptr [[DOTCAPTURE_EXPR_]], align 43124// CHECK33-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43125// CHECK33-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP20]], 03126// CHECK33-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 13127// CHECK33-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 13128// CHECK33-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 43129// CHECK33-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43130// CHECK33-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP21]], 13131// CHECK33-NEXT: [[TMP22:%.*]] = zext i32 [[ADD]] to i643132// CHECK33-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 03133// CHECK33-NEXT: store i32 3, ptr [[TMP23]], align 43134// CHECK33-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 13135// CHECK33-NEXT: store i32 3, ptr [[TMP24]], align 43136// CHECK33-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 23137// CHECK33-NEXT: store ptr [[TMP16]], ptr [[TMP25]], align 83138// CHECK33-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 33139// CHECK33-NEXT: store ptr [[TMP17]], ptr [[TMP26]], align 83140// CHECK33-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 43141// CHECK33-NEXT: store ptr [[TMP18]], ptr [[TMP27]], align 83142// CHECK33-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 53143// CHECK33-NEXT: store ptr @.offload_maptypes, ptr [[TMP28]], align 83144// CHECK33-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 63145// CHECK33-NEXT: store ptr null, ptr [[TMP29]], align 83146// CHECK33-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 73147// CHECK33-NEXT: store ptr null, ptr [[TMP30]], align 83148// CHECK33-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 83149// CHECK33-NEXT: store i64 [[TMP22]], ptr [[TMP31]], align 83150// CHECK33-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 93151// CHECK33-NEXT: store i64 0, ptr [[TMP32]], align 83152// CHECK33-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 103153// CHECK33-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP33]], align 43154// CHECK33-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 113155// CHECK33-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP34]], align 43156// CHECK33-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 123157// CHECK33-NEXT: store i32 0, ptr [[TMP35]], align 43158// CHECK33-NEXT: [[TMP36:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.region_id, ptr [[KERNEL_ARGS]])3159// CHECK33-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 03160// CHECK33-NEXT: br i1 [[TMP37]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]3161// CHECK33: omp_offload.failed:3162// CHECK33-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192(i64 [[TMP4]], i64 [[TMP1]], ptr [[VLA]]) #[[ATTR3:[0-9]+]]3163// CHECK33-NEXT: br label [[OMP_OFFLOAD_CONT]]3164// CHECK33: omp_offload.cont:3165// CHECK33-NEXT: [[TMP38:%.*]] = load i32, ptr [[ARGC_ADDR]], align 43166// CHECK33-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP38]])3167// CHECK33-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 43168// CHECK33-NEXT: [[TMP39:%.*]] = load ptr, ptr [[SAVED_STACK]], align 83169// CHECK33-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP39]])3170// CHECK33-NEXT: [[TMP40:%.*]] = load i32, ptr [[RETVAL]], align 43171// CHECK33-NEXT: ret i32 [[TMP40]]3172//3173//3174// CHECK33-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l1923175// CHECK33-SAME: (i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {3176// CHECK33-NEXT: entry:3177// CHECK33-NEXT: [[N_ADDR:%.*]] = alloca i64, align 83178// CHECK33-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 83179// CHECK33-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 83180// CHECK33-NEXT: store i64 [[N]], ptr [[N_ADDR]], align 83181// CHECK33-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 83182// CHECK33-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 83183// CHECK33-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 83184// CHECK33-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 83185// CHECK33-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined, ptr [[N_ADDR]], i64 [[TMP0]], ptr [[TMP1]])3186// CHECK33-NEXT: ret void3187//3188//3189// CHECK33-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined3190// CHECK33-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {3191// CHECK33-NEXT: entry:3192// CHECK33-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83193// CHECK33-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83194// CHECK33-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 83195// CHECK33-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 83196// CHECK33-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 83197// CHECK33-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43198// CHECK33-NEXT: [[TMP:%.*]] = alloca i32, align 43199// CHECK33-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 43200// CHECK33-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 43201// CHECK33-NEXT: [[I:%.*]] = alloca i32, align 43202// CHECK33-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43203// CHECK33-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43204// CHECK33-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43205// CHECK33-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43206// CHECK33-NEXT: [[I3:%.*]] = alloca i32, align 43207// CHECK33-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83208// CHECK33-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83209// CHECK33-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 83210// CHECK33-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 83211// CHECK33-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 83212// CHECK33-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 83213// CHECK33-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR]], align 83214// CHECK33-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 83215// CHECK33-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 43216// CHECK33-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 43217// CHECK33-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43218// CHECK33-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 03219// CHECK33-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 13220// CHECK33-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 13221// CHECK33-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 43222// CHECK33-NEXT: store i32 0, ptr [[I]], align 43223// CHECK33-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43224// CHECK33-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]3225// CHECK33-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]3226// CHECK33: omp.precond.then:3227// CHECK33-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43228// CHECK33-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43229// CHECK33-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 43230// CHECK33-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43231// CHECK33-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43232// CHECK33-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83233// CHECK33-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 43234// CHECK33-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3235// CHECK33-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43236// CHECK33-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43237// CHECK33-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]3238// CHECK33-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3239// CHECK33: cond.true:3240// CHECK33-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43241// CHECK33-NEXT: br label [[COND_END:%.*]]3242// CHECK33: cond.false:3243// CHECK33-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43244// CHECK33-NEXT: br label [[COND_END]]3245// CHECK33: cond.end:3246// CHECK33-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]3247// CHECK33-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43248// CHECK33-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43249// CHECK33-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 43250// CHECK33-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3251// CHECK33: omp.inner.for.cond:3252// CHECK33-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5:![0-9]+]]3253// CHECK33-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP5]]3254// CHECK33-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]3255// CHECK33-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3256// CHECK33: omp.inner.for.body:3257// CHECK33-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]3258// CHECK33-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 13259// CHECK33-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3260// CHECK33-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP5]]3261// CHECK33-NEXT: [[TMP17:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP5]]3262// CHECK33-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i643263// CHECK33-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[IDXPROM]]3264// CHECK33-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP5]]3265// CHECK33-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3266// CHECK33: omp.body.continue:3267// CHECK33-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3268// CHECK33: omp.inner.for.inc:3269// CHECK33-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]3270// CHECK33-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP18]], 13271// CHECK33-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]3272// CHECK33-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]3273// CHECK33: omp.inner.for.end:3274// CHECK33-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3275// CHECK33: omp.loop.exit:3276// CHECK33-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83277// CHECK33-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 43278// CHECK33-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])3279// CHECK33-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43280// CHECK33-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 03281// CHECK33-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3282// CHECK33: .omp.final.then:3283// CHECK33-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43284// CHECK33-NEXT: [[SUB7:%.*]] = sub nsw i32 [[TMP23]], 03285// CHECK33-NEXT: [[DIV8:%.*]] = sdiv i32 [[SUB7]], 13286// CHECK33-NEXT: [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 13287// CHECK33-NEXT: [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]3288// CHECK33-NEXT: store i32 [[ADD10]], ptr [[I3]], align 43289// CHECK33-NEXT: br label [[DOTOMP_FINAL_DONE]]3290// CHECK33: .omp.final.done:3291// CHECK33-NEXT: br label [[OMP_PRECOND_END]]3292// CHECK33: omp.precond.end:3293// CHECK33-NEXT: ret void3294//3295//3296// CHECK33-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_3297// CHECK33-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {3298// CHECK33-NEXT: entry:3299// CHECK33-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 43300// CHECK33-NEXT: [[A:%.*]] = alloca [10 x i32], align 43301// CHECK33-NEXT: [[TE:%.*]] = alloca i32, align 43302// CHECK33-NEXT: [[TH:%.*]] = alloca i32, align 43303// CHECK33-NEXT: [[TE_CASTED:%.*]] = alloca i64, align 83304// CHECK33-NEXT: [[TH_CASTED:%.*]] = alloca i64, align 83305// CHECK33-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 83306// CHECK33-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 83307// CHECK33-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 83308// CHECK33-NEXT: [[TMP:%.*]] = alloca i32, align 43309// CHECK33-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 83310// CHECK33-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 43311// CHECK33-NEXT: store i32 0, ptr [[TE]], align 43312// CHECK33-NEXT: store i32 128, ptr [[TH]], align 43313// CHECK33-NEXT: [[TMP0:%.*]] = load i32, ptr [[TE]], align 43314// CHECK33-NEXT: store i32 [[TMP0]], ptr [[TE_CASTED]], align 43315// CHECK33-NEXT: [[TMP1:%.*]] = load i64, ptr [[TE_CASTED]], align 83316// CHECK33-NEXT: [[TMP2:%.*]] = load i32, ptr [[TH]], align 43317// CHECK33-NEXT: store i32 [[TMP2]], ptr [[TH_CASTED]], align 43318// CHECK33-NEXT: [[TMP3:%.*]] = load i64, ptr [[TH_CASTED]], align 83319// CHECK33-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03320// CHECK33-NEXT: store i64 [[TMP1]], ptr [[TMP4]], align 83321// CHECK33-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03322// CHECK33-NEXT: store i64 [[TMP1]], ptr [[TMP5]], align 83323// CHECK33-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 03324// CHECK33-NEXT: store ptr null, ptr [[TMP6]], align 83325// CHECK33-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 13326// CHECK33-NEXT: store i64 [[TMP3]], ptr [[TMP7]], align 83327// CHECK33-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 13328// CHECK33-NEXT: store i64 [[TMP3]], ptr [[TMP8]], align 83329// CHECK33-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 13330// CHECK33-NEXT: store ptr null, ptr [[TMP9]], align 83331// CHECK33-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 23332// CHECK33-NEXT: store ptr [[A]], ptr [[TMP10]], align 83333// CHECK33-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 23334// CHECK33-NEXT: store ptr [[A]], ptr [[TMP11]], align 83335// CHECK33-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 23336// CHECK33-NEXT: store ptr null, ptr [[TMP12]], align 83337// CHECK33-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03338// CHECK33-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03339// CHECK33-NEXT: [[TMP15:%.*]] = load i32, ptr [[TE]], align 43340// CHECK33-NEXT: [[TMP16:%.*]] = load i32, ptr [[TH]], align 43341// CHECK33-NEXT: [[TMP17:%.*]] = icmp ult i32 [[TMP16]], 13342// CHECK33-NEXT: [[TMP18:%.*]] = select i1 [[TMP17]], i32 [[TMP16]], i32 13343// CHECK33-NEXT: [[TMP19:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP15]], 03344// CHECK33-NEXT: [[TMP20:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP18]], 03345// CHECK33-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 03346// CHECK33-NEXT: store i32 3, ptr [[TMP21]], align 43347// CHECK33-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 13348// CHECK33-NEXT: store i32 3, ptr [[TMP22]], align 43349// CHECK33-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 23350// CHECK33-NEXT: store ptr [[TMP13]], ptr [[TMP23]], align 83351// CHECK33-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 33352// CHECK33-NEXT: store ptr [[TMP14]], ptr [[TMP24]], align 83353// CHECK33-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 43354// CHECK33-NEXT: store ptr @.offload_sizes.1, ptr [[TMP25]], align 83355// CHECK33-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 53356// CHECK33-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP26]], align 83357// CHECK33-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 63358// CHECK33-NEXT: store ptr null, ptr [[TMP27]], align 83359// CHECK33-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 73360// CHECK33-NEXT: store ptr null, ptr [[TMP28]], align 83361// CHECK33-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 83362// CHECK33-NEXT: store i64 10, ptr [[TMP29]], align 83363// CHECK33-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 93364// CHECK33-NEXT: store i64 0, ptr [[TMP30]], align 83365// CHECK33-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 103366// CHECK33-NEXT: store [3 x i32] [[TMP19]], ptr [[TMP31]], align 43367// CHECK33-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 113368// CHECK33-NEXT: store [3 x i32] [[TMP20]], ptr [[TMP32]], align 43369// CHECK33-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 123370// CHECK33-NEXT: store i32 0, ptr [[TMP33]], align 43371// CHECK33-NEXT: [[TMP34:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 [[TMP15]], i32 [[TMP18]], ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.region_id, ptr [[KERNEL_ARGS]])3372// CHECK33-NEXT: [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 03373// CHECK33-NEXT: br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]3374// CHECK33: omp_offload.failed:3375// CHECK33-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181(i64 [[TMP1]], i64 [[TMP3]], ptr [[A]]) #[[ATTR3]]3376// CHECK33-NEXT: br label [[OMP_OFFLOAD_CONT]]3377// CHECK33: omp_offload.cont:3378// CHECK33-NEXT: ret i32 03379//3380//3381// CHECK33-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l1813382// CHECK33-SAME: (i64 noundef [[TE:%.*]], i64 noundef [[TH:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {3383// CHECK33-NEXT: entry:3384// CHECK33-NEXT: [[TE_ADDR:%.*]] = alloca i64, align 83385// CHECK33-NEXT: [[TH_ADDR:%.*]] = alloca i64, align 83386// CHECK33-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 83387// CHECK33-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])3388// CHECK33-NEXT: store i64 [[TE]], ptr [[TE_ADDR]], align 83389// CHECK33-NEXT: store i64 [[TH]], ptr [[TH_ADDR]], align 83390// CHECK33-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 83391// CHECK33-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 83392// CHECK33-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_ADDR]], align 43393// CHECK33-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_ADDR]], align 43394// CHECK33-NEXT: call void @__kmpc_push_num_teams(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP2]], i32 [[TMP3]])3395// CHECK33-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined, ptr [[TMP1]])3396// CHECK33-NEXT: ret void3397//3398//3399// CHECK33-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined3400// CHECK33-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {3401// CHECK33-NEXT: entry:3402// CHECK33-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 83403// CHECK33-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 83404// CHECK33-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 83405// CHECK33-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43406// CHECK33-NEXT: [[TMP:%.*]] = alloca i32, align 43407// CHECK33-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43408// CHECK33-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43409// CHECK33-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43410// CHECK33-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43411// CHECK33-NEXT: [[I:%.*]] = alloca i32, align 43412// CHECK33-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 83413// CHECK33-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 83414// CHECK33-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 83415// CHECK33-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 83416// CHECK33-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43417// CHECK33-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43418// CHECK33-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43419// CHECK33-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43420// CHECK33-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 83421// CHECK33-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 43422// CHECK33-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3423// CHECK33-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43424// CHECK33-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 93425// CHECK33-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3426// CHECK33: cond.true:3427// CHECK33-NEXT: br label [[COND_END:%.*]]3428// CHECK33: cond.false:3429// CHECK33-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43430// CHECK33-NEXT: br label [[COND_END]]3431// CHECK33: cond.end:3432// CHECK33-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]3433// CHECK33-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43434// CHECK33-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43435// CHECK33-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 43436// CHECK33-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3437// CHECK33: omp.inner.for.cond:3438// CHECK33-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP11:![0-9]+]]3439// CHECK33-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP11]]3440// CHECK33-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]3441// CHECK33-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3442// CHECK33: omp.inner.for.body:3443// CHECK33-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP11]]3444// CHECK33-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 13445// CHECK33-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3446// CHECK33-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP11]]3447// CHECK33-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP11]]3448// CHECK33-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP9]] to i643449// CHECK33-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]3450// CHECK33-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP11]]3451// CHECK33-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3452// CHECK33: omp.body.continue:3453// CHECK33-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3454// CHECK33: omp.inner.for.inc:3455// CHECK33-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP11]]3456// CHECK33-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 13457// CHECK33-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP11]]3458// CHECK33-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]]3459// CHECK33: omp.inner.for.end:3460// CHECK33-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3461// CHECK33: omp.loop.exit:3462// CHECK33-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])3463// CHECK33-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43464// CHECK33-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 03465// CHECK33-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3466// CHECK33: .omp.final.then:3467// CHECK33-NEXT: store i32 10, ptr [[I]], align 43468// CHECK33-NEXT: br label [[DOTOMP_FINAL_DONE]]3469// CHECK33: .omp.final.done:3470// CHECK33-NEXT: ret void3471//3472//3473// CHECK35-LABEL: define {{[^@]+}}@main3474// CHECK35-SAME: (i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {3475// CHECK35-NEXT: entry:3476// CHECK35-NEXT: [[RETVAL:%.*]] = alloca i32, align 43477// CHECK35-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 43478// CHECK35-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 43479// CHECK35-NEXT: [[N:%.*]] = alloca i32, align 43480// CHECK35-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 43481// CHECK35-NEXT: [[__VLA_EXPR0:%.*]] = alloca i32, align 43482// CHECK35-NEXT: [[N_CASTED:%.*]] = alloca i32, align 43483// CHECK35-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 43484// CHECK35-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 43485// CHECK35-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 43486// CHECK35-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 43487// CHECK35-NEXT: [[TMP:%.*]] = alloca i32, align 43488// CHECK35-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 43489// CHECK35-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 43490// CHECK35-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 83491// CHECK35-NEXT: store i32 0, ptr [[RETVAL]], align 43492// CHECK35-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 43493// CHECK35-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 43494// CHECK35-NEXT: store i32 100, ptr [[N]], align 43495// CHECK35-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 43496// CHECK35-NEXT: [[TMP1:%.*]] = call ptr @llvm.stacksave.p0()3497// CHECK35-NEXT: store ptr [[TMP1]], ptr [[SAVED_STACK]], align 43498// CHECK35-NEXT: [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 43499// CHECK35-NEXT: store i32 [[TMP0]], ptr [[__VLA_EXPR0]], align 43500// CHECK35-NEXT: [[TMP2:%.*]] = load i32, ptr [[N]], align 43501// CHECK35-NEXT: store i32 [[TMP2]], ptr [[N_CASTED]], align 43502// CHECK35-NEXT: [[TMP3:%.*]] = load i32, ptr [[N_CASTED]], align 43503// CHECK35-NEXT: [[TMP4:%.*]] = mul nuw i32 [[TMP0]], 43504// CHECK35-NEXT: [[TMP5:%.*]] = sext i32 [[TMP4]] to i643505// CHECK35-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[DOTOFFLOAD_SIZES]], ptr align 4 @.offload_sizes, i32 24, i1 false)3506// CHECK35-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03507// CHECK35-NEXT: store i32 [[TMP3]], ptr [[TMP6]], align 43508// CHECK35-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03509// CHECK35-NEXT: store i32 [[TMP3]], ptr [[TMP7]], align 43510// CHECK35-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 03511// CHECK35-NEXT: store ptr null, ptr [[TMP8]], align 43512// CHECK35-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 13513// CHECK35-NEXT: store i32 [[TMP0]], ptr [[TMP9]], align 43514// CHECK35-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 13515// CHECK35-NEXT: store i32 [[TMP0]], ptr [[TMP10]], align 43516// CHECK35-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 13517// CHECK35-NEXT: store ptr null, ptr [[TMP11]], align 43518// CHECK35-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 23519// CHECK35-NEXT: store ptr [[VLA]], ptr [[TMP12]], align 43520// CHECK35-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 23521// CHECK35-NEXT: store ptr [[VLA]], ptr [[TMP13]], align 43522// CHECK35-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 23523// CHECK35-NEXT: store i64 [[TMP5]], ptr [[TMP14]], align 43524// CHECK35-NEXT: [[TMP15:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 23525// CHECK35-NEXT: store ptr null, ptr [[TMP15]], align 43526// CHECK35-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03527// CHECK35-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03528// CHECK35-NEXT: [[TMP18:%.*]] = getelementptr inbounds [3 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 03529// CHECK35-NEXT: [[TMP19:%.*]] = load i32, ptr [[N]], align 43530// CHECK35-NEXT: store i32 [[TMP19]], ptr [[DOTCAPTURE_EXPR_]], align 43531// CHECK35-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43532// CHECK35-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP20]], 03533// CHECK35-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 13534// CHECK35-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 13535// CHECK35-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 43536// CHECK35-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43537// CHECK35-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP21]], 13538// CHECK35-NEXT: [[TMP22:%.*]] = zext i32 [[ADD]] to i643539// CHECK35-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 03540// CHECK35-NEXT: store i32 3, ptr [[TMP23]], align 43541// CHECK35-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 13542// CHECK35-NEXT: store i32 3, ptr [[TMP24]], align 43543// CHECK35-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 23544// CHECK35-NEXT: store ptr [[TMP16]], ptr [[TMP25]], align 43545// CHECK35-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 33546// CHECK35-NEXT: store ptr [[TMP17]], ptr [[TMP26]], align 43547// CHECK35-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 43548// CHECK35-NEXT: store ptr [[TMP18]], ptr [[TMP27]], align 43549// CHECK35-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 53550// CHECK35-NEXT: store ptr @.offload_maptypes, ptr [[TMP28]], align 43551// CHECK35-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 63552// CHECK35-NEXT: store ptr null, ptr [[TMP29]], align 43553// CHECK35-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 73554// CHECK35-NEXT: store ptr null, ptr [[TMP30]], align 43555// CHECK35-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 83556// CHECK35-NEXT: store i64 [[TMP22]], ptr [[TMP31]], align 83557// CHECK35-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 93558// CHECK35-NEXT: store i64 0, ptr [[TMP32]], align 83559// CHECK35-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 103560// CHECK35-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP33]], align 43561// CHECK35-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 113562// CHECK35-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP34]], align 43563// CHECK35-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 123564// CHECK35-NEXT: store i32 0, ptr [[TMP35]], align 43565// CHECK35-NEXT: [[TMP36:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.region_id, ptr [[KERNEL_ARGS]])3566// CHECK35-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 03567// CHECK35-NEXT: br i1 [[TMP37]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]3568// CHECK35: omp_offload.failed:3569// CHECK35-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192(i32 [[TMP3]], i32 [[TMP0]], ptr [[VLA]]) #[[ATTR3:[0-9]+]]3570// CHECK35-NEXT: br label [[OMP_OFFLOAD_CONT]]3571// CHECK35: omp_offload.cont:3572// CHECK35-NEXT: [[TMP38:%.*]] = load i32, ptr [[ARGC_ADDR]], align 43573// CHECK35-NEXT: [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP38]])3574// CHECK35-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 43575// CHECK35-NEXT: [[TMP39:%.*]] = load ptr, ptr [[SAVED_STACK]], align 43576// CHECK35-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP39]])3577// CHECK35-NEXT: [[TMP40:%.*]] = load i32, ptr [[RETVAL]], align 43578// CHECK35-NEXT: ret i32 [[TMP40]]3579//3580//3581// CHECK35-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l1923582// CHECK35-SAME: (i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {3583// CHECK35-NEXT: entry:3584// CHECK35-NEXT: [[N_ADDR:%.*]] = alloca i32, align 43585// CHECK35-NEXT: [[VLA_ADDR:%.*]] = alloca i32, align 43586// CHECK35-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 43587// CHECK35-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 43588// CHECK35-NEXT: store i32 [[VLA]], ptr [[VLA_ADDR]], align 43589// CHECK35-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 43590// CHECK35-NEXT: [[TMP0:%.*]] = load i32, ptr [[VLA_ADDR]], align 43591// CHECK35-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 43592// CHECK35-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 3, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined, ptr [[N_ADDR]], i32 [[TMP0]], ptr [[TMP1]])3593// CHECK35-NEXT: ret void3594//3595//3596// CHECK35-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined3597// CHECK35-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2]] {3598// CHECK35-NEXT: entry:3599// CHECK35-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 43600// CHECK35-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 43601// CHECK35-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 43602// CHECK35-NEXT: [[VLA_ADDR:%.*]] = alloca i32, align 43603// CHECK35-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 43604// CHECK35-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43605// CHECK35-NEXT: [[TMP:%.*]] = alloca i32, align 43606// CHECK35-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 43607// CHECK35-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 43608// CHECK35-NEXT: [[I:%.*]] = alloca i32, align 43609// CHECK35-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43610// CHECK35-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43611// CHECK35-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43612// CHECK35-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43613// CHECK35-NEXT: [[I3:%.*]] = alloca i32, align 43614// CHECK35-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 43615// CHECK35-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 43616// CHECK35-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 43617// CHECK35-NEXT: store i32 [[VLA]], ptr [[VLA_ADDR]], align 43618// CHECK35-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 43619// CHECK35-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 43620// CHECK35-NEXT: [[TMP1:%.*]] = load i32, ptr [[VLA_ADDR]], align 43621// CHECK35-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 43622// CHECK35-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 43623// CHECK35-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 43624// CHECK35-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43625// CHECK35-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 03626// CHECK35-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 13627// CHECK35-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 13628// CHECK35-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 43629// CHECK35-NEXT: store i32 0, ptr [[I]], align 43630// CHECK35-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43631// CHECK35-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]3632// CHECK35-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]3633// CHECK35: omp.precond.then:3634// CHECK35-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43635// CHECK35-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43636// CHECK35-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 43637// CHECK35-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43638// CHECK35-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43639// CHECK35-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 43640// CHECK35-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 43641// CHECK35-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3642// CHECK35-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43643// CHECK35-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43644// CHECK35-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]3645// CHECK35-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3646// CHECK35: cond.true:3647// CHECK35-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43648// CHECK35-NEXT: br label [[COND_END:%.*]]3649// CHECK35: cond.false:3650// CHECK35-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43651// CHECK35-NEXT: br label [[COND_END]]3652// CHECK35: cond.end:3653// CHECK35-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]3654// CHECK35-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43655// CHECK35-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43656// CHECK35-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 43657// CHECK35-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3658// CHECK35: omp.inner.for.cond:3659// CHECK35-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6:![0-9]+]]3660// CHECK35-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP6]]3661// CHECK35-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]3662// CHECK35-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3663// CHECK35: omp.inner.for.body:3664// CHECK35-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]3665// CHECK35-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP16]], 13666// CHECK35-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3667// CHECK35-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP6]]3668// CHECK35-NEXT: [[TMP17:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP6]]3669// CHECK35-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[TMP17]]3670// CHECK35-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP6]]3671// CHECK35-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3672// CHECK35: omp.body.continue:3673// CHECK35-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3674// CHECK35: omp.inner.for.inc:3675// CHECK35-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]3676// CHECK35-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP18]], 13677// CHECK35-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]3678// CHECK35-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]3679// CHECK35: omp.inner.for.end:3680// CHECK35-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3681// CHECK35: omp.loop.exit:3682// CHECK35-NEXT: [[TMP19:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 43683// CHECK35-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 43684// CHECK35-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP20]])3685// CHECK35-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43686// CHECK35-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 03687// CHECK35-NEXT: br i1 [[TMP22]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3688// CHECK35: .omp.final.then:3689// CHECK35-NEXT: [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43690// CHECK35-NEXT: [[SUB7:%.*]] = sub nsw i32 [[TMP23]], 03691// CHECK35-NEXT: [[DIV8:%.*]] = sdiv i32 [[SUB7]], 13692// CHECK35-NEXT: [[MUL9:%.*]] = mul nsw i32 [[DIV8]], 13693// CHECK35-NEXT: [[ADD10:%.*]] = add nsw i32 0, [[MUL9]]3694// CHECK35-NEXT: store i32 [[ADD10]], ptr [[I3]], align 43695// CHECK35-NEXT: br label [[DOTOMP_FINAL_DONE]]3696// CHECK35: .omp.final.done:3697// CHECK35-NEXT: br label [[OMP_PRECOND_END]]3698// CHECK35: omp.precond.end:3699// CHECK35-NEXT: ret void3700//3701//3702// CHECK35-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_3703// CHECK35-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {3704// CHECK35-NEXT: entry:3705// CHECK35-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 43706// CHECK35-NEXT: [[A:%.*]] = alloca [10 x i32], align 43707// CHECK35-NEXT: [[TE:%.*]] = alloca i32, align 43708// CHECK35-NEXT: [[TH:%.*]] = alloca i32, align 43709// CHECK35-NEXT: [[TE_CASTED:%.*]] = alloca i32, align 43710// CHECK35-NEXT: [[TH_CASTED:%.*]] = alloca i32, align 43711// CHECK35-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 43712// CHECK35-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 43713// CHECK35-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 43714// CHECK35-NEXT: [[TMP:%.*]] = alloca i32, align 43715// CHECK35-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 83716// CHECK35-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 43717// CHECK35-NEXT: store i32 0, ptr [[TE]], align 43718// CHECK35-NEXT: store i32 128, ptr [[TH]], align 43719// CHECK35-NEXT: [[TMP0:%.*]] = load i32, ptr [[TE]], align 43720// CHECK35-NEXT: store i32 [[TMP0]], ptr [[TE_CASTED]], align 43721// CHECK35-NEXT: [[TMP1:%.*]] = load i32, ptr [[TE_CASTED]], align 43722// CHECK35-NEXT: [[TMP2:%.*]] = load i32, ptr [[TH]], align 43723// CHECK35-NEXT: store i32 [[TMP2]], ptr [[TH_CASTED]], align 43724// CHECK35-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_CASTED]], align 43725// CHECK35-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03726// CHECK35-NEXT: store i32 [[TMP1]], ptr [[TMP4]], align 43727// CHECK35-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03728// CHECK35-NEXT: store i32 [[TMP1]], ptr [[TMP5]], align 43729// CHECK35-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 03730// CHECK35-NEXT: store ptr null, ptr [[TMP6]], align 43731// CHECK35-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 13732// CHECK35-NEXT: store i32 [[TMP3]], ptr [[TMP7]], align 43733// CHECK35-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 13734// CHECK35-NEXT: store i32 [[TMP3]], ptr [[TMP8]], align 43735// CHECK35-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 13736// CHECK35-NEXT: store ptr null, ptr [[TMP9]], align 43737// CHECK35-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 23738// CHECK35-NEXT: store ptr [[A]], ptr [[TMP10]], align 43739// CHECK35-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 23740// CHECK35-NEXT: store ptr [[A]], ptr [[TMP11]], align 43741// CHECK35-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 23742// CHECK35-NEXT: store ptr null, ptr [[TMP12]], align 43743// CHECK35-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03744// CHECK35-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03745// CHECK35-NEXT: [[TMP15:%.*]] = load i32, ptr [[TE]], align 43746// CHECK35-NEXT: [[TMP16:%.*]] = load i32, ptr [[TH]], align 43747// CHECK35-NEXT: [[TMP17:%.*]] = icmp ult i32 [[TMP16]], 13748// CHECK35-NEXT: [[TMP18:%.*]] = select i1 [[TMP17]], i32 [[TMP16]], i32 13749// CHECK35-NEXT: [[TMP19:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP15]], 03750// CHECK35-NEXT: [[TMP20:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP18]], 03751// CHECK35-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 03752// CHECK35-NEXT: store i32 3, ptr [[TMP21]], align 43753// CHECK35-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 13754// CHECK35-NEXT: store i32 3, ptr [[TMP22]], align 43755// CHECK35-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 23756// CHECK35-NEXT: store ptr [[TMP13]], ptr [[TMP23]], align 43757// CHECK35-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 33758// CHECK35-NEXT: store ptr [[TMP14]], ptr [[TMP24]], align 43759// CHECK35-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 43760// CHECK35-NEXT: store ptr @.offload_sizes.1, ptr [[TMP25]], align 43761// CHECK35-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 53762// CHECK35-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP26]], align 43763// CHECK35-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 63764// CHECK35-NEXT: store ptr null, ptr [[TMP27]], align 43765// CHECK35-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 73766// CHECK35-NEXT: store ptr null, ptr [[TMP28]], align 43767// CHECK35-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 83768// CHECK35-NEXT: store i64 10, ptr [[TMP29]], align 83769// CHECK35-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 93770// CHECK35-NEXT: store i64 0, ptr [[TMP30]], align 83771// CHECK35-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 103772// CHECK35-NEXT: store [3 x i32] [[TMP19]], ptr [[TMP31]], align 43773// CHECK35-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 113774// CHECK35-NEXT: store [3 x i32] [[TMP20]], ptr [[TMP32]], align 43775// CHECK35-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 123776// CHECK35-NEXT: store i32 0, ptr [[TMP33]], align 43777// CHECK35-NEXT: [[TMP34:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 [[TMP15]], i32 [[TMP18]], ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.region_id, ptr [[KERNEL_ARGS]])3778// CHECK35-NEXT: [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 03779// CHECK35-NEXT: br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]3780// CHECK35: omp_offload.failed:3781// CHECK35-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181(i32 [[TMP1]], i32 [[TMP3]], ptr [[A]]) #[[ATTR3]]3782// CHECK35-NEXT: br label [[OMP_OFFLOAD_CONT]]3783// CHECK35: omp_offload.cont:3784// CHECK35-NEXT: ret i32 03785//3786//3787// CHECK35-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l1813788// CHECK35-SAME: (i32 noundef [[TE:%.*]], i32 noundef [[TH:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {3789// CHECK35-NEXT: entry:3790// CHECK35-NEXT: [[TE_ADDR:%.*]] = alloca i32, align 43791// CHECK35-NEXT: [[TH_ADDR:%.*]] = alloca i32, align 43792// CHECK35-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 43793// CHECK35-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])3794// CHECK35-NEXT: store i32 [[TE]], ptr [[TE_ADDR]], align 43795// CHECK35-NEXT: store i32 [[TH]], ptr [[TH_ADDR]], align 43796// CHECK35-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 43797// CHECK35-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 43798// CHECK35-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_ADDR]], align 43799// CHECK35-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_ADDR]], align 43800// CHECK35-NEXT: call void @__kmpc_push_num_teams(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP2]], i32 [[TMP3]])3801// CHECK35-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined, ptr [[TMP1]])3802// CHECK35-NEXT: ret void3803//3804//3805// CHECK35-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined3806// CHECK35-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {3807// CHECK35-NEXT: entry:3808// CHECK35-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 43809// CHECK35-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 43810// CHECK35-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 43811// CHECK35-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 43812// CHECK35-NEXT: [[TMP:%.*]] = alloca i32, align 43813// CHECK35-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 43814// CHECK35-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 43815// CHECK35-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 43816// CHECK35-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 43817// CHECK35-NEXT: [[I:%.*]] = alloca i32, align 43818// CHECK35-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 43819// CHECK35-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 43820// CHECK35-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 43821// CHECK35-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 43822// CHECK35-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 43823// CHECK35-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 43824// CHECK35-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 43825// CHECK35-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 43826// CHECK35-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 43827// CHECK35-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 43828// CHECK35-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)3829// CHECK35-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43830// CHECK35-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 93831// CHECK35-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3832// CHECK35: cond.true:3833// CHECK35-NEXT: br label [[COND_END:%.*]]3834// CHECK35: cond.false:3835// CHECK35-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 43836// CHECK35-NEXT: br label [[COND_END]]3837// CHECK35: cond.end:3838// CHECK35-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]3839// CHECK35-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 43840// CHECK35-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 43841// CHECK35-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 43842// CHECK35-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]3843// CHECK35: omp.inner.for.cond:3844// CHECK35-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP12:![0-9]+]]3845// CHECK35-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP12]]3846// CHECK35-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]3847// CHECK35-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]3848// CHECK35: omp.inner.for.body:3849// CHECK35-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP12]]3850// CHECK35-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 13851// CHECK35-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]3852// CHECK35-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP12]]3853// CHECK35-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP12]]3854// CHECK35-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[TMP0]], i32 0, i32 [[TMP9]]3855// CHECK35-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP12]]3856// CHECK35-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]3857// CHECK35: omp.body.continue:3858// CHECK35-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]3859// CHECK35: omp.inner.for.inc:3860// CHECK35-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP12]]3861// CHECK35-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 13862// CHECK35-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP12]]3863// CHECK35-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]3864// CHECK35: omp.inner.for.end:3865// CHECK35-NEXT: br label [[OMP_LOOP_EXIT:%.*]]3866// CHECK35: omp.loop.exit:3867// CHECK35-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])3868// CHECK35-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 43869// CHECK35-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 03870// CHECK35-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]3871// CHECK35: .omp.final.then:3872// CHECK35-NEXT: store i32 10, ptr [[I]], align 43873// CHECK35-NEXT: br label [[DOTOMP_FINAL_DONE]]3874// CHECK35: .omp.final.done:3875// CHECK35-NEXT: ret void3876//3877//3878// CHECK37-LABEL: define {{[^@]+}}@main3879// CHECK37-SAME: (i32 noundef signext [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {3880// CHECK37-NEXT: entry:3881// CHECK37-NEXT: [[RETVAL:%.*]] = alloca i32, align 43882// CHECK37-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 43883// CHECK37-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 83884// CHECK37-NEXT: [[N:%.*]] = alloca i32, align 43885// CHECK37-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 83886// CHECK37-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 83887// CHECK37-NEXT: [[ARGC_CASTED:%.*]] = alloca i64, align 83888// CHECK37-NEXT: [[N_CASTED:%.*]] = alloca i64, align 83889// CHECK37-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 83890// CHECK37-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 83891// CHECK37-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 83892// CHECK37-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [4 x i64], align 83893// CHECK37-NEXT: [[TMP:%.*]] = alloca i32, align 43894// CHECK37-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 43895// CHECK37-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 43896// CHECK37-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 83897// CHECK37-NEXT: store i32 0, ptr [[RETVAL]], align 43898// CHECK37-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 43899// CHECK37-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 83900// CHECK37-NEXT: store i32 100, ptr [[N]], align 43901// CHECK37-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 43902// CHECK37-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i643903// CHECK37-NEXT: [[TMP2:%.*]] = call ptr @llvm.stacksave.p0()3904// CHECK37-NEXT: store ptr [[TMP2]], ptr [[SAVED_STACK]], align 83905// CHECK37-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 43906// CHECK37-NEXT: store i64 [[TMP1]], ptr [[__VLA_EXPR0]], align 83907// CHECK37-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARGC_ADDR]], align 43908// CHECK37-NEXT: store i32 [[TMP3]], ptr [[ARGC_CASTED]], align 43909// CHECK37-NEXT: [[TMP4:%.*]] = load i64, ptr [[ARGC_CASTED]], align 83910// CHECK37-NEXT: [[TMP5:%.*]] = load i32, ptr [[N]], align 43911// CHECK37-NEXT: store i32 [[TMP5]], ptr [[N_CASTED]], align 43912// CHECK37-NEXT: [[TMP6:%.*]] = load i64, ptr [[N_CASTED]], align 83913// CHECK37-NEXT: [[TMP7:%.*]] = mul nuw i64 [[TMP1]], 43914// CHECK37-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DOTOFFLOAD_SIZES]], ptr align 8 @.offload_sizes, i64 32, i1 false)3915// CHECK37-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03916// CHECK37-NEXT: store i64 [[TMP4]], ptr [[TMP8]], align 83917// CHECK37-NEXT: [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03918// CHECK37-NEXT: store i64 [[TMP4]], ptr [[TMP9]], align 83919// CHECK37-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 03920// CHECK37-NEXT: store ptr null, ptr [[TMP10]], align 83921// CHECK37-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 13922// CHECK37-NEXT: store i64 [[TMP6]], ptr [[TMP11]], align 83923// CHECK37-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 13924// CHECK37-NEXT: store i64 [[TMP6]], ptr [[TMP12]], align 83925// CHECK37-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 13926// CHECK37-NEXT: store ptr null, ptr [[TMP13]], align 83927// CHECK37-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 23928// CHECK37-NEXT: store i64 [[TMP1]], ptr [[TMP14]], align 83929// CHECK37-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 23930// CHECK37-NEXT: store i64 [[TMP1]], ptr [[TMP15]], align 83931// CHECK37-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 23932// CHECK37-NEXT: store ptr null, ptr [[TMP16]], align 83933// CHECK37-NEXT: [[TMP17:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 33934// CHECK37-NEXT: store ptr [[VLA]], ptr [[TMP17]], align 83935// CHECK37-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 33936// CHECK37-NEXT: store ptr [[VLA]], ptr [[TMP18]], align 83937// CHECK37-NEXT: [[TMP19:%.*]] = getelementptr inbounds [4 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 33938// CHECK37-NEXT: store i64 [[TMP7]], ptr [[TMP19]], align 83939// CHECK37-NEXT: [[TMP20:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 33940// CHECK37-NEXT: store ptr null, ptr [[TMP20]], align 83941// CHECK37-NEXT: [[TMP21:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 03942// CHECK37-NEXT: [[TMP22:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 03943// CHECK37-NEXT: [[TMP23:%.*]] = getelementptr inbounds [4 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 03944// CHECK37-NEXT: [[TMP24:%.*]] = load i32, ptr [[N]], align 43945// CHECK37-NEXT: store i32 [[TMP24]], ptr [[DOTCAPTURE_EXPR_]], align 43946// CHECK37-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 43947// CHECK37-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP25]], 03948// CHECK37-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 13949// CHECK37-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 13950// CHECK37-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 43951// CHECK37-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 43952// CHECK37-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP26]], 13953// CHECK37-NEXT: [[TMP27:%.*]] = zext i32 [[ADD]] to i643954// CHECK37-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 03955// CHECK37-NEXT: store i32 3, ptr [[TMP28]], align 43956// CHECK37-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 13957// CHECK37-NEXT: store i32 4, ptr [[TMP29]], align 43958// CHECK37-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 23959// CHECK37-NEXT: store ptr [[TMP21]], ptr [[TMP30]], align 83960// CHECK37-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 33961// CHECK37-NEXT: store ptr [[TMP22]], ptr [[TMP31]], align 83962// CHECK37-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 43963// CHECK37-NEXT: store ptr [[TMP23]], ptr [[TMP32]], align 83964// CHECK37-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 53965// CHECK37-NEXT: store ptr @.offload_maptypes, ptr [[TMP33]], align 83966// CHECK37-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 63967// CHECK37-NEXT: store ptr null, ptr [[TMP34]], align 83968// CHECK37-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 73969// CHECK37-NEXT: store ptr null, ptr [[TMP35]], align 83970// CHECK37-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 83971// CHECK37-NEXT: store i64 [[TMP27]], ptr [[TMP36]], align 83972// CHECK37-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 93973// CHECK37-NEXT: store i64 0, ptr [[TMP37]], align 83974// CHECK37-NEXT: [[TMP38:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 103975// CHECK37-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP38]], align 43976// CHECK37-NEXT: [[TMP39:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 113977// CHECK37-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP39]], align 43978// CHECK37-NEXT: [[TMP40:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 123979// CHECK37-NEXT: store i32 0, ptr [[TMP40]], align 43980// CHECK37-NEXT: [[TMP41:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.region_id, ptr [[KERNEL_ARGS]])3981// CHECK37-NEXT: [[TMP42:%.*]] = icmp ne i32 [[TMP41]], 03982// CHECK37-NEXT: br i1 [[TMP42]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]3983// CHECK37: omp_offload.failed:3984// CHECK37-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192(i64 [[TMP4]], i64 [[TMP6]], i64 [[TMP1]], ptr [[VLA]]) #[[ATTR3:[0-9]+]]3985// CHECK37-NEXT: br label [[OMP_OFFLOAD_CONT]]3986// CHECK37: omp_offload.cont:3987// CHECK37-NEXT: [[TMP43:%.*]] = load i32, ptr [[ARGC_ADDR]], align 43988// CHECK37-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP43]])3989// CHECK37-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 43990// CHECK37-NEXT: [[TMP44:%.*]] = load ptr, ptr [[SAVED_STACK]], align 83991// CHECK37-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP44]])3992// CHECK37-NEXT: [[TMP45:%.*]] = load i32, ptr [[RETVAL]], align 43993// CHECK37-NEXT: ret i32 [[TMP45]]3994//3995//3996// CHECK37-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l1923997// CHECK37-SAME: (i64 noundef [[ARGC:%.*]], i64 noundef [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {3998// CHECK37-NEXT: entry:3999// CHECK37-NEXT: [[ARGC_ADDR:%.*]] = alloca i64, align 84000// CHECK37-NEXT: [[N_ADDR:%.*]] = alloca i64, align 84001// CHECK37-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 84002// CHECK37-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 84003// CHECK37-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 14004// CHECK37-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i64, align 84005// CHECK37-NEXT: store i64 [[ARGC]], ptr [[ARGC_ADDR]], align 84006// CHECK37-NEXT: store i64 [[N]], ptr [[N_ADDR]], align 84007// CHECK37-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 84008// CHECK37-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 84009// CHECK37-NEXT: [[TMP0:%.*]] = load i64, ptr [[VLA_ADDR]], align 84010// CHECK37-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 84011// CHECK37-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARGC_ADDR]], align 44012// CHECK37-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 04013// CHECK37-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i84014// CHECK37-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 14015// CHECK37-NEXT: [[TMP3:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 14016// CHECK37-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP3]] to i14017// CHECK37-NEXT: [[STOREDV1:%.*]] = zext i1 [[LOADEDV]] to i84018// CHECK37-NEXT: store i8 [[STOREDV1]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 14019// CHECK37-NEXT: [[TMP4:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR__CASTED]], align 84020// CHECK37-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 4, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined, ptr [[N_ADDR]], i64 [[TMP0]], ptr [[TMP1]], i64 [[TMP4]])4021// CHECK37-NEXT: ret void4022//4023//4024// CHECK37-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined4025// CHECK37-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i64 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i64 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {4026// CHECK37-NEXT: entry:4027// CHECK37-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84028// CHECK37-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84029// CHECK37-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 84030// CHECK37-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 84031// CHECK37-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 84032// CHECK37-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i64, align 84033// CHECK37-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44034// CHECK37-NEXT: [[TMP:%.*]] = alloca i32, align 44035// CHECK37-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 44036// CHECK37-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 44037// CHECK37-NEXT: [[I:%.*]] = alloca i32, align 44038// CHECK37-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44039// CHECK37-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44040// CHECK37-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44041// CHECK37-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44042// CHECK37-NEXT: [[I4:%.*]] = alloca i32, align 44043// CHECK37-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84044// CHECK37-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84045// CHECK37-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 84046// CHECK37-NEXT: store i64 [[VLA]], ptr [[VLA_ADDR]], align 84047// CHECK37-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 84048// CHECK37-NEXT: store i64 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 84049// CHECK37-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 84050// CHECK37-NEXT: [[TMP1:%.*]] = load i64, ptr [[VLA_ADDR]], align 84051// CHECK37-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 84052// CHECK37-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 44053// CHECK37-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_1]], align 44054// CHECK37-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44055// CHECK37-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 04056// CHECK37-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 14057// CHECK37-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV]], 14058// CHECK37-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_2]], align 44059// CHECK37-NEXT: store i32 0, ptr [[I]], align 44060// CHECK37-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44061// CHECK37-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]4062// CHECK37-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]4063// CHECK37: omp.precond.then:4064// CHECK37-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44065// CHECK37-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 44066// CHECK37-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 44067// CHECK37-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44068// CHECK37-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44069// CHECK37-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84070// CHECK37-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 44071// CHECK37-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4072// CHECK37-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44073// CHECK37-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 44074// CHECK37-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]4075// CHECK37-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4076// CHECK37: cond.true:4077// CHECK37-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 44078// CHECK37-NEXT: br label [[COND_END:%.*]]4079// CHECK37: cond.false:4080// CHECK37-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44081// CHECK37-NEXT: br label [[COND_END]]4082// CHECK37: cond.end:4083// CHECK37-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]4084// CHECK37-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44085// CHECK37-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44086// CHECK37-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 44087// CHECK37-NEXT: [[TMP14:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 14088// CHECK37-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP14]] to i14089// CHECK37-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]4090// CHECK37: omp_if.then:4091// CHECK37-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4092// CHECK37: omp.inner.for.cond:4093// CHECK37-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5:![0-9]+]]4094// CHECK37-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP5]]4095// CHECK37-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]4096// CHECK37-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4097// CHECK37: omp.inner.for.body:4098// CHECK37-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]4099// CHECK37-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP17]], 14100// CHECK37-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4101// CHECK37-NEXT: store i32 [[ADD]], ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP5]]4102// CHECK37-NEXT: [[TMP18:%.*]] = load i32, ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP5]]4103// CHECK37-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP18]] to i644104// CHECK37-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[IDXPROM]]4105// CHECK37-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP5]]4106// CHECK37-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4107// CHECK37: omp.body.continue:4108// CHECK37-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4109// CHECK37: omp.inner.for.inc:4110// CHECK37-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]4111// CHECK37-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP19]], 14112// CHECK37-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP5]]4113// CHECK37-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]4114// CHECK37: omp.inner.for.end:4115// CHECK37-NEXT: br label [[OMP_IF_END:%.*]]4116// CHECK37: omp_if.else:4117// CHECK37-NEXT: br label [[OMP_INNER_FOR_COND8:%.*]]4118// CHECK37: omp.inner.for.cond8:4119// CHECK37-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44120// CHECK37-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44121// CHECK37-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]4122// CHECK37-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY10:%.*]], label [[OMP_INNER_FOR_END18:%.*]]4123// CHECK37: omp.inner.for.body10:4124// CHECK37-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44125// CHECK37-NEXT: [[MUL11:%.*]] = mul nsw i32 [[TMP22]], 14126// CHECK37-NEXT: [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]4127// CHECK37-NEXT: store i32 [[ADD12]], ptr [[I4]], align 44128// CHECK37-NEXT: [[TMP23:%.*]] = load i32, ptr [[I4]], align 44129// CHECK37-NEXT: [[IDXPROM13:%.*]] = sext i32 [[TMP23]] to i644130// CHECK37-NEXT: [[ARRAYIDX14:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i64 [[IDXPROM13]]4131// CHECK37-NEXT: store i32 0, ptr [[ARRAYIDX14]], align 44132// CHECK37-NEXT: br label [[OMP_BODY_CONTINUE15:%.*]]4133// CHECK37: omp.body.continue15:4134// CHECK37-NEXT: br label [[OMP_INNER_FOR_INC16:%.*]]4135// CHECK37: omp.inner.for.inc16:4136// CHECK37-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44137// CHECK37-NEXT: [[ADD17:%.*]] = add nsw i32 [[TMP24]], 14138// CHECK37-NEXT: store i32 [[ADD17]], ptr [[DOTOMP_IV]], align 44139// CHECK37-NEXT: br label [[OMP_INNER_FOR_COND8]], !llvm.loop [[LOOP9:![0-9]+]]4140// CHECK37: omp.inner.for.end18:4141// CHECK37-NEXT: br label [[OMP_IF_END]]4142// CHECK37: omp_if.end:4143// CHECK37-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4144// CHECK37: omp.loop.exit:4145// CHECK37-NEXT: [[TMP25:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84146// CHECK37-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 44147// CHECK37-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP26]])4148// CHECK37-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44149// CHECK37-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 04150// CHECK37-NEXT: br i1 [[TMP28]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4151// CHECK37: .omp.final.then:4152// CHECK37-NEXT: [[TMP29:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44153// CHECK37-NEXT: [[SUB19:%.*]] = sub nsw i32 [[TMP29]], 04154// CHECK37-NEXT: [[DIV20:%.*]] = sdiv i32 [[SUB19]], 14155// CHECK37-NEXT: [[MUL21:%.*]] = mul nsw i32 [[DIV20]], 14156// CHECK37-NEXT: [[ADD22:%.*]] = add nsw i32 0, [[MUL21]]4157// CHECK37-NEXT: store i32 [[ADD22]], ptr [[I4]], align 44158// CHECK37-NEXT: br label [[DOTOMP_FINAL_DONE]]4159// CHECK37: .omp.final.done:4160// CHECK37-NEXT: br label [[OMP_PRECOND_END]]4161// CHECK37: omp.precond.end:4162// CHECK37-NEXT: ret void4163//4164//4165// CHECK37-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_4166// CHECK37-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {4167// CHECK37-NEXT: entry:4168// CHECK37-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44169// CHECK37-NEXT: [[A:%.*]] = alloca [10 x i32], align 44170// CHECK37-NEXT: [[TE:%.*]] = alloca i32, align 44171// CHECK37-NEXT: [[TH:%.*]] = alloca i32, align 44172// CHECK37-NEXT: [[TE_CASTED:%.*]] = alloca i64, align 84173// CHECK37-NEXT: [[TH_CASTED:%.*]] = alloca i64, align 84174// CHECK37-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 84175// CHECK37-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 84176// CHECK37-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 84177// CHECK37-NEXT: [[TMP:%.*]] = alloca i32, align 44178// CHECK37-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 84179// CHECK37-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44180// CHECK37-NEXT: store i32 0, ptr [[TE]], align 44181// CHECK37-NEXT: store i32 128, ptr [[TH]], align 44182// CHECK37-NEXT: [[TMP0:%.*]] = load i32, ptr [[TE]], align 44183// CHECK37-NEXT: store i32 [[TMP0]], ptr [[TE_CASTED]], align 44184// CHECK37-NEXT: [[TMP1:%.*]] = load i64, ptr [[TE_CASTED]], align 84185// CHECK37-NEXT: [[TMP2:%.*]] = load i32, ptr [[TH]], align 44186// CHECK37-NEXT: store i32 [[TMP2]], ptr [[TH_CASTED]], align 44187// CHECK37-NEXT: [[TMP3:%.*]] = load i64, ptr [[TH_CASTED]], align 84188// CHECK37-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 04189// CHECK37-NEXT: store i64 [[TMP1]], ptr [[TMP4]], align 84190// CHECK37-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 04191// CHECK37-NEXT: store i64 [[TMP1]], ptr [[TMP5]], align 84192// CHECK37-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 04193// CHECK37-NEXT: store ptr null, ptr [[TMP6]], align 84194// CHECK37-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 14195// CHECK37-NEXT: store i64 [[TMP3]], ptr [[TMP7]], align 84196// CHECK37-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 14197// CHECK37-NEXT: store i64 [[TMP3]], ptr [[TMP8]], align 84198// CHECK37-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 14199// CHECK37-NEXT: store ptr null, ptr [[TMP9]], align 84200// CHECK37-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 24201// CHECK37-NEXT: store ptr [[A]], ptr [[TMP10]], align 84202// CHECK37-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 24203// CHECK37-NEXT: store ptr [[A]], ptr [[TMP11]], align 84204// CHECK37-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i64 0, i64 24205// CHECK37-NEXT: store ptr null, ptr [[TMP12]], align 84206// CHECK37-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 04207// CHECK37-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 04208// CHECK37-NEXT: [[TMP15:%.*]] = load i32, ptr [[TE]], align 44209// CHECK37-NEXT: [[TMP16:%.*]] = load i32, ptr [[TH]], align 44210// CHECK37-NEXT: [[TMP17:%.*]] = icmp ult i32 [[TMP16]], 14211// CHECK37-NEXT: [[TMP18:%.*]] = select i1 [[TMP17]], i32 [[TMP16]], i32 14212// CHECK37-NEXT: [[TMP19:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP15]], 04213// CHECK37-NEXT: [[TMP20:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP18]], 04214// CHECK37-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 04215// CHECK37-NEXT: store i32 3, ptr [[TMP21]], align 44216// CHECK37-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 14217// CHECK37-NEXT: store i32 3, ptr [[TMP22]], align 44218// CHECK37-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 24219// CHECK37-NEXT: store ptr [[TMP13]], ptr [[TMP23]], align 84220// CHECK37-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 34221// CHECK37-NEXT: store ptr [[TMP14]], ptr [[TMP24]], align 84222// CHECK37-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 44223// CHECK37-NEXT: store ptr @.offload_sizes.1, ptr [[TMP25]], align 84224// CHECK37-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 54225// CHECK37-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP26]], align 84226// CHECK37-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 64227// CHECK37-NEXT: store ptr null, ptr [[TMP27]], align 84228// CHECK37-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 74229// CHECK37-NEXT: store ptr null, ptr [[TMP28]], align 84230// CHECK37-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 84231// CHECK37-NEXT: store i64 10, ptr [[TMP29]], align 84232// CHECK37-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 94233// CHECK37-NEXT: store i64 0, ptr [[TMP30]], align 84234// CHECK37-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 104235// CHECK37-NEXT: store [3 x i32] [[TMP19]], ptr [[TMP31]], align 44236// CHECK37-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 114237// CHECK37-NEXT: store [3 x i32] [[TMP20]], ptr [[TMP32]], align 44238// CHECK37-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 124239// CHECK37-NEXT: store i32 0, ptr [[TMP33]], align 44240// CHECK37-NEXT: [[TMP34:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 [[TMP15]], i32 [[TMP18]], ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.region_id, ptr [[KERNEL_ARGS]])4241// CHECK37-NEXT: [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 04242// CHECK37-NEXT: br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]4243// CHECK37: omp_offload.failed:4244// CHECK37-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181(i64 [[TMP1]], i64 [[TMP3]], ptr [[A]]) #[[ATTR3]]4245// CHECK37-NEXT: br label [[OMP_OFFLOAD_CONT]]4246// CHECK37: omp_offload.cont:4247// CHECK37-NEXT: ret i32 04248//4249//4250// CHECK37-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l1814251// CHECK37-SAME: (i64 noundef [[TE:%.*]], i64 noundef [[TH:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {4252// CHECK37-NEXT: entry:4253// CHECK37-NEXT: [[TE_ADDR:%.*]] = alloca i64, align 84254// CHECK37-NEXT: [[TH_ADDR:%.*]] = alloca i64, align 84255// CHECK37-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 84256// CHECK37-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])4257// CHECK37-NEXT: store i64 [[TE]], ptr [[TE_ADDR]], align 84258// CHECK37-NEXT: store i64 [[TH]], ptr [[TH_ADDR]], align 84259// CHECK37-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 84260// CHECK37-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 84261// CHECK37-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_ADDR]], align 44262// CHECK37-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_ADDR]], align 44263// CHECK37-NEXT: call void @__kmpc_push_num_teams(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP2]], i32 [[TMP3]])4264// CHECK37-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined, ptr [[TMP1]])4265// CHECK37-NEXT: ret void4266//4267//4268// CHECK37-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined4269// CHECK37-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {4270// CHECK37-NEXT: entry:4271// CHECK37-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 84272// CHECK37-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 84273// CHECK37-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 84274// CHECK37-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44275// CHECK37-NEXT: [[TMP:%.*]] = alloca i32, align 44276// CHECK37-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44277// CHECK37-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44278// CHECK37-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44279// CHECK37-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44280// CHECK37-NEXT: [[I:%.*]] = alloca i32, align 44281// CHECK37-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 84282// CHECK37-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 84283// CHECK37-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 84284// CHECK37-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 84285// CHECK37-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44286// CHECK37-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44287// CHECK37-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44288// CHECK37-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44289// CHECK37-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 84290// CHECK37-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 44291// CHECK37-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4292// CHECK37-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44293// CHECK37-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 94294// CHECK37-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4295// CHECK37: cond.true:4296// CHECK37-NEXT: br label [[COND_END:%.*]]4297// CHECK37: cond.false:4298// CHECK37-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44299// CHECK37-NEXT: br label [[COND_END]]4300// CHECK37: cond.end:4301// CHECK37-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]4302// CHECK37-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44303// CHECK37-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44304// CHECK37-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 44305// CHECK37-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4306// CHECK37: omp.inner.for.cond:4307// CHECK37-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP13:![0-9]+]]4308// CHECK37-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP13]]4309// CHECK37-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]4310// CHECK37-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4311// CHECK37: omp.inner.for.body:4312// CHECK37-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP13]]4313// CHECK37-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 14314// CHECK37-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4315// CHECK37-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP13]]4316// CHECK37-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP13]]4317// CHECK37-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP9]] to i644318// CHECK37-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]4319// CHECK37-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP13]]4320// CHECK37-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4321// CHECK37: omp.body.continue:4322// CHECK37-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4323// CHECK37: omp.inner.for.inc:4324// CHECK37-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP13]]4325// CHECK37-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 14326// CHECK37-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP13]]4327// CHECK37-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]4328// CHECK37: omp.inner.for.end:4329// CHECK37-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4330// CHECK37: omp.loop.exit:4331// CHECK37-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])4332// CHECK37-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44333// CHECK37-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 04334// CHECK37-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4335// CHECK37: .omp.final.then:4336// CHECK37-NEXT: store i32 10, ptr [[I]], align 44337// CHECK37-NEXT: br label [[DOTOMP_FINAL_DONE]]4338// CHECK37: .omp.final.done:4339// CHECK37-NEXT: ret void4340//4341//4342// CHECK39-LABEL: define {{[^@]+}}@main4343// CHECK39-SAME: (i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {4344// CHECK39-NEXT: entry:4345// CHECK39-NEXT: [[RETVAL:%.*]] = alloca i32, align 44346// CHECK39-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44347// CHECK39-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 44348// CHECK39-NEXT: [[N:%.*]] = alloca i32, align 44349// CHECK39-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 44350// CHECK39-NEXT: [[__VLA_EXPR0:%.*]] = alloca i32, align 44351// CHECK39-NEXT: [[ARGC_CASTED:%.*]] = alloca i32, align 44352// CHECK39-NEXT: [[N_CASTED:%.*]] = alloca i32, align 44353// CHECK39-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [4 x ptr], align 44354// CHECK39-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [4 x ptr], align 44355// CHECK39-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [4 x ptr], align 44356// CHECK39-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [4 x i64], align 44357// CHECK39-NEXT: [[TMP:%.*]] = alloca i32, align 44358// CHECK39-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 44359// CHECK39-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 44360// CHECK39-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 84361// CHECK39-NEXT: store i32 0, ptr [[RETVAL]], align 44362// CHECK39-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44363// CHECK39-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 44364// CHECK39-NEXT: store i32 100, ptr [[N]], align 44365// CHECK39-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 44366// CHECK39-NEXT: [[TMP1:%.*]] = call ptr @llvm.stacksave.p0()4367// CHECK39-NEXT: store ptr [[TMP1]], ptr [[SAVED_STACK]], align 44368// CHECK39-NEXT: [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 44369// CHECK39-NEXT: store i32 [[TMP0]], ptr [[__VLA_EXPR0]], align 44370// CHECK39-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARGC_ADDR]], align 44371// CHECK39-NEXT: store i32 [[TMP2]], ptr [[ARGC_CASTED]], align 44372// CHECK39-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARGC_CASTED]], align 44373// CHECK39-NEXT: [[TMP4:%.*]] = load i32, ptr [[N]], align 44374// CHECK39-NEXT: store i32 [[TMP4]], ptr [[N_CASTED]], align 44375// CHECK39-NEXT: [[TMP5:%.*]] = load i32, ptr [[N_CASTED]], align 44376// CHECK39-NEXT: [[TMP6:%.*]] = mul nuw i32 [[TMP0]], 44377// CHECK39-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i644378// CHECK39-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[DOTOFFLOAD_SIZES]], ptr align 4 @.offload_sizes, i32 32, i1 false)4379// CHECK39-NEXT: [[TMP8:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 04380// CHECK39-NEXT: store i32 [[TMP3]], ptr [[TMP8]], align 44381// CHECK39-NEXT: [[TMP9:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 04382// CHECK39-NEXT: store i32 [[TMP3]], ptr [[TMP9]], align 44383// CHECK39-NEXT: [[TMP10:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 04384// CHECK39-NEXT: store ptr null, ptr [[TMP10]], align 44385// CHECK39-NEXT: [[TMP11:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 14386// CHECK39-NEXT: store i32 [[TMP5]], ptr [[TMP11]], align 44387// CHECK39-NEXT: [[TMP12:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 14388// CHECK39-NEXT: store i32 [[TMP5]], ptr [[TMP12]], align 44389// CHECK39-NEXT: [[TMP13:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 14390// CHECK39-NEXT: store ptr null, ptr [[TMP13]], align 44391// CHECK39-NEXT: [[TMP14:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 24392// CHECK39-NEXT: store i32 [[TMP0]], ptr [[TMP14]], align 44393// CHECK39-NEXT: [[TMP15:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 24394// CHECK39-NEXT: store i32 [[TMP0]], ptr [[TMP15]], align 44395// CHECK39-NEXT: [[TMP16:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 24396// CHECK39-NEXT: store ptr null, ptr [[TMP16]], align 44397// CHECK39-NEXT: [[TMP17:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 34398// CHECK39-NEXT: store ptr [[VLA]], ptr [[TMP17]], align 44399// CHECK39-NEXT: [[TMP18:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 34400// CHECK39-NEXT: store ptr [[VLA]], ptr [[TMP18]], align 44401// CHECK39-NEXT: [[TMP19:%.*]] = getelementptr inbounds [4 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 34402// CHECK39-NEXT: store i64 [[TMP7]], ptr [[TMP19]], align 44403// CHECK39-NEXT: [[TMP20:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 34404// CHECK39-NEXT: store ptr null, ptr [[TMP20]], align 44405// CHECK39-NEXT: [[TMP21:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 04406// CHECK39-NEXT: [[TMP22:%.*]] = getelementptr inbounds [4 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 04407// CHECK39-NEXT: [[TMP23:%.*]] = getelementptr inbounds [4 x i64], ptr [[DOTOFFLOAD_SIZES]], i32 0, i32 04408// CHECK39-NEXT: [[TMP24:%.*]] = load i32, ptr [[N]], align 44409// CHECK39-NEXT: store i32 [[TMP24]], ptr [[DOTCAPTURE_EXPR_]], align 44410// CHECK39-NEXT: [[TMP25:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 44411// CHECK39-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP25]], 04412// CHECK39-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 14413// CHECK39-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 14414// CHECK39-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 44415// CHECK39-NEXT: [[TMP26:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44416// CHECK39-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP26]], 14417// CHECK39-NEXT: [[TMP27:%.*]] = zext i32 [[ADD]] to i644418// CHECK39-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 04419// CHECK39-NEXT: store i32 3, ptr [[TMP28]], align 44420// CHECK39-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 14421// CHECK39-NEXT: store i32 4, ptr [[TMP29]], align 44422// CHECK39-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 24423// CHECK39-NEXT: store ptr [[TMP21]], ptr [[TMP30]], align 44424// CHECK39-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 34425// CHECK39-NEXT: store ptr [[TMP22]], ptr [[TMP31]], align 44426// CHECK39-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 44427// CHECK39-NEXT: store ptr [[TMP23]], ptr [[TMP32]], align 44428// CHECK39-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 54429// CHECK39-NEXT: store ptr @.offload_maptypes, ptr [[TMP33]], align 44430// CHECK39-NEXT: [[TMP34:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 64431// CHECK39-NEXT: store ptr null, ptr [[TMP34]], align 44432// CHECK39-NEXT: [[TMP35:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 74433// CHECK39-NEXT: store ptr null, ptr [[TMP35]], align 44434// CHECK39-NEXT: [[TMP36:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 84435// CHECK39-NEXT: store i64 [[TMP27]], ptr [[TMP36]], align 84436// CHECK39-NEXT: [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 94437// CHECK39-NEXT: store i64 0, ptr [[TMP37]], align 84438// CHECK39-NEXT: [[TMP38:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 104439// CHECK39-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP38]], align 44440// CHECK39-NEXT: [[TMP39:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 114441// CHECK39-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP39]], align 44442// CHECK39-NEXT: [[TMP40:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 124443// CHECK39-NEXT: store i32 0, ptr [[TMP40]], align 44444// CHECK39-NEXT: [[TMP41:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 0, i32 1, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.region_id, ptr [[KERNEL_ARGS]])4445// CHECK39-NEXT: [[TMP42:%.*]] = icmp ne i32 [[TMP41]], 04446// CHECK39-NEXT: br i1 [[TMP42]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]4447// CHECK39: omp_offload.failed:4448// CHECK39-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192(i32 [[TMP3]], i32 [[TMP5]], i32 [[TMP0]], ptr [[VLA]]) #[[ATTR3:[0-9]+]]4449// CHECK39-NEXT: br label [[OMP_OFFLOAD_CONT]]4450// CHECK39: omp_offload.cont:4451// CHECK39-NEXT: [[TMP43:%.*]] = load i32, ptr [[ARGC_ADDR]], align 44452// CHECK39-NEXT: [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP43]])4453// CHECK39-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 44454// CHECK39-NEXT: [[TMP44:%.*]] = load ptr, ptr [[SAVED_STACK]], align 44455// CHECK39-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP44]])4456// CHECK39-NEXT: [[TMP45:%.*]] = load i32, ptr [[RETVAL]], align 44457// CHECK39-NEXT: ret i32 [[TMP45]]4458//4459//4460// CHECK39-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l1924461// CHECK39-SAME: (i32 noundef [[ARGC:%.*]], i32 noundef [[N:%.*]], i32 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] {4462// CHECK39-NEXT: entry:4463// CHECK39-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44464// CHECK39-NEXT: [[N_ADDR:%.*]] = alloca i32, align 44465// CHECK39-NEXT: [[VLA_ADDR:%.*]] = alloca i32, align 44466// CHECK39-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 44467// CHECK39-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 14468// CHECK39-NEXT: [[DOTCAPTURE_EXPR__CASTED:%.*]] = alloca i32, align 44469// CHECK39-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44470// CHECK39-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 44471// CHECK39-NEXT: store i32 [[VLA]], ptr [[VLA_ADDR]], align 44472// CHECK39-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 44473// CHECK39-NEXT: [[TMP0:%.*]] = load i32, ptr [[VLA_ADDR]], align 44474// CHECK39-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 44475// CHECK39-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARGC_ADDR]], align 44476// CHECK39-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 04477// CHECK39-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i84478// CHECK39-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 14479// CHECK39-NEXT: [[TMP3:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 14480// CHECK39-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP3]] to i14481// CHECK39-NEXT: [[STOREDV1:%.*]] = zext i1 [[LOADEDV]] to i84482// CHECK39-NEXT: store i8 [[STOREDV1]], ptr [[DOTCAPTURE_EXPR__CASTED]], align 14483// CHECK39-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR__CASTED]], align 44484// CHECK39-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 4, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined, ptr [[N_ADDR]], i32 [[TMP0]], ptr [[TMP1]], i32 [[TMP4]])4485// CHECK39-NEXT: ret void4486//4487//4488// CHECK39-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_main_l192.omp_outlined4489// CHECK39-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[N:%.*]], i32 noundef [[VLA:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i32 noundef [[DOTCAPTURE_EXPR_:%.*]]) #[[ATTR2]] {4490// CHECK39-NEXT: entry:4491// CHECK39-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 44492// CHECK39-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 44493// CHECK39-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 44494// CHECK39-NEXT: [[VLA_ADDR:%.*]] = alloca i32, align 44495// CHECK39-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 44496// CHECK39-NEXT: [[DOTCAPTURE_EXPR__ADDR:%.*]] = alloca i32, align 44497// CHECK39-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44498// CHECK39-NEXT: [[TMP:%.*]] = alloca i32, align 44499// CHECK39-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 44500// CHECK39-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 44501// CHECK39-NEXT: [[I:%.*]] = alloca i32, align 44502// CHECK39-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44503// CHECK39-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44504// CHECK39-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44505// CHECK39-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44506// CHECK39-NEXT: [[I4:%.*]] = alloca i32, align 44507// CHECK39-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 44508// CHECK39-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 44509// CHECK39-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 44510// CHECK39-NEXT: store i32 [[VLA]], ptr [[VLA_ADDR]], align 44511// CHECK39-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 44512// CHECK39-NEXT: store i32 [[DOTCAPTURE_EXPR_]], ptr [[DOTCAPTURE_EXPR__ADDR]], align 44513// CHECK39-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 44514// CHECK39-NEXT: [[TMP1:%.*]] = load i32, ptr [[VLA_ADDR]], align 44515// CHECK39-NEXT: [[TMP2:%.*]] = load ptr, ptr [[A_ADDR]], align 44516// CHECK39-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 44517// CHECK39-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_1]], align 44518// CHECK39-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44519// CHECK39-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 04520// CHECK39-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 14521// CHECK39-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV]], 14522// CHECK39-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_2]], align 44523// CHECK39-NEXT: store i32 0, ptr [[I]], align 44524// CHECK39-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44525// CHECK39-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]4526// CHECK39-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]4527// CHECK39: omp.precond.then:4528// CHECK39-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44529// CHECK39-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 44530// CHECK39-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 44531// CHECK39-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44532// CHECK39-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44533// CHECK39-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 44534// CHECK39-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 44535// CHECK39-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4536// CHECK39-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44537// CHECK39-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 44538// CHECK39-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP9]], [[TMP10]]4539// CHECK39-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4540// CHECK39: cond.true:4541// CHECK39-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 44542// CHECK39-NEXT: br label [[COND_END:%.*]]4543// CHECK39: cond.false:4544// CHECK39-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44545// CHECK39-NEXT: br label [[COND_END]]4546// CHECK39: cond.end:4547// CHECK39-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]4548// CHECK39-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44549// CHECK39-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44550// CHECK39-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 44551// CHECK39-NEXT: [[TMP14:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR__ADDR]], align 14552// CHECK39-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP14]] to i14553// CHECK39-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]4554// CHECK39: omp_if.then:4555// CHECK39-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4556// CHECK39: omp.inner.for.cond:4557// CHECK39-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6:![0-9]+]]4558// CHECK39-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP6]]4559// CHECK39-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]4560// CHECK39-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4561// CHECK39: omp.inner.for.body:4562// CHECK39-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]4563// CHECK39-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP17]], 14564// CHECK39-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4565// CHECK39-NEXT: store i32 [[ADD]], ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP6]]4566// CHECK39-NEXT: [[TMP18:%.*]] = load i32, ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP6]]4567// CHECK39-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[TMP18]]4568// CHECK39-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP6]]4569// CHECK39-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4570// CHECK39: omp.body.continue:4571// CHECK39-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4572// CHECK39: omp.inner.for.inc:4573// CHECK39-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]4574// CHECK39-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP19]], 14575// CHECK39-NEXT: store i32 [[ADD7]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]4576// CHECK39-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]4577// CHECK39: omp.inner.for.end:4578// CHECK39-NEXT: br label [[OMP_IF_END:%.*]]4579// CHECK39: omp_if.else:4580// CHECK39-NEXT: br label [[OMP_INNER_FOR_COND8:%.*]]4581// CHECK39: omp.inner.for.cond8:4582// CHECK39-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44583// CHECK39-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44584// CHECK39-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]]4585// CHECK39-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY10:%.*]], label [[OMP_INNER_FOR_END17:%.*]]4586// CHECK39: omp.inner.for.body10:4587// CHECK39-NEXT: [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44588// CHECK39-NEXT: [[MUL11:%.*]] = mul nsw i32 [[TMP22]], 14589// CHECK39-NEXT: [[ADD12:%.*]] = add nsw i32 0, [[MUL11]]4590// CHECK39-NEXT: store i32 [[ADD12]], ptr [[I4]], align 44591// CHECK39-NEXT: [[TMP23:%.*]] = load i32, ptr [[I4]], align 44592// CHECK39-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 [[TMP23]]4593// CHECK39-NEXT: store i32 0, ptr [[ARRAYIDX13]], align 44594// CHECK39-NEXT: br label [[OMP_BODY_CONTINUE14:%.*]]4595// CHECK39: omp.body.continue14:4596// CHECK39-NEXT: br label [[OMP_INNER_FOR_INC15:%.*]]4597// CHECK39: omp.inner.for.inc15:4598// CHECK39-NEXT: [[TMP24:%.*]] = load i32, ptr [[DOTOMP_IV]], align 44599// CHECK39-NEXT: [[ADD16:%.*]] = add nsw i32 [[TMP24]], 14600// CHECK39-NEXT: store i32 [[ADD16]], ptr [[DOTOMP_IV]], align 44601// CHECK39-NEXT: br label [[OMP_INNER_FOR_COND8]], !llvm.loop [[LOOP10:![0-9]+]]4602// CHECK39: omp.inner.for.end17:4603// CHECK39-NEXT: br label [[OMP_IF_END]]4604// CHECK39: omp_if.end:4605// CHECK39-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4606// CHECK39: omp.loop.exit:4607// CHECK39-NEXT: [[TMP25:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 44608// CHECK39-NEXT: [[TMP26:%.*]] = load i32, ptr [[TMP25]], align 44609// CHECK39-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP26]])4610// CHECK39-NEXT: [[TMP27:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44611// CHECK39-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 04612// CHECK39-NEXT: br i1 [[TMP28]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4613// CHECK39: .omp.final.then:4614// CHECK39-NEXT: [[TMP29:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44615// CHECK39-NEXT: [[SUB18:%.*]] = sub nsw i32 [[TMP29]], 04616// CHECK39-NEXT: [[DIV19:%.*]] = sdiv i32 [[SUB18]], 14617// CHECK39-NEXT: [[MUL20:%.*]] = mul nsw i32 [[DIV19]], 14618// CHECK39-NEXT: [[ADD21:%.*]] = add nsw i32 0, [[MUL20]]4619// CHECK39-NEXT: store i32 [[ADD21]], ptr [[I4]], align 44620// CHECK39-NEXT: br label [[DOTOMP_FINAL_DONE]]4621// CHECK39: .omp.final.done:4622// CHECK39-NEXT: br label [[OMP_PRECOND_END]]4623// CHECK39: omp.precond.end:4624// CHECK39-NEXT: ret void4625//4626//4627// CHECK39-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_4628// CHECK39-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR5:[0-9]+]] comdat {4629// CHECK39-NEXT: entry:4630// CHECK39-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44631// CHECK39-NEXT: [[A:%.*]] = alloca [10 x i32], align 44632// CHECK39-NEXT: [[TE:%.*]] = alloca i32, align 44633// CHECK39-NEXT: [[TH:%.*]] = alloca i32, align 44634// CHECK39-NEXT: [[TE_CASTED:%.*]] = alloca i32, align 44635// CHECK39-NEXT: [[TH_CASTED:%.*]] = alloca i32, align 44636// CHECK39-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x ptr], align 44637// CHECK39-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x ptr], align 44638// CHECK39-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x ptr], align 44639// CHECK39-NEXT: [[TMP:%.*]] = alloca i32, align 44640// CHECK39-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 84641// CHECK39-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44642// CHECK39-NEXT: store i32 0, ptr [[TE]], align 44643// CHECK39-NEXT: store i32 128, ptr [[TH]], align 44644// CHECK39-NEXT: [[TMP0:%.*]] = load i32, ptr [[TE]], align 44645// CHECK39-NEXT: store i32 [[TMP0]], ptr [[TE_CASTED]], align 44646// CHECK39-NEXT: [[TMP1:%.*]] = load i32, ptr [[TE_CASTED]], align 44647// CHECK39-NEXT: [[TMP2:%.*]] = load i32, ptr [[TH]], align 44648// CHECK39-NEXT: store i32 [[TMP2]], ptr [[TH_CASTED]], align 44649// CHECK39-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_CASTED]], align 44650// CHECK39-NEXT: [[TMP4:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 04651// CHECK39-NEXT: store i32 [[TMP1]], ptr [[TMP4]], align 44652// CHECK39-NEXT: [[TMP5:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 04653// CHECK39-NEXT: store i32 [[TMP1]], ptr [[TMP5]], align 44654// CHECK39-NEXT: [[TMP6:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 04655// CHECK39-NEXT: store ptr null, ptr [[TMP6]], align 44656// CHECK39-NEXT: [[TMP7:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 14657// CHECK39-NEXT: store i32 [[TMP3]], ptr [[TMP7]], align 44658// CHECK39-NEXT: [[TMP8:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 14659// CHECK39-NEXT: store i32 [[TMP3]], ptr [[TMP8]], align 44660// CHECK39-NEXT: [[TMP9:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 14661// CHECK39-NEXT: store ptr null, ptr [[TMP9]], align 44662// CHECK39-NEXT: [[TMP10:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 24663// CHECK39-NEXT: store ptr [[A]], ptr [[TMP10]], align 44664// CHECK39-NEXT: [[TMP11:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 24665// CHECK39-NEXT: store ptr [[A]], ptr [[TMP11]], align 44666// CHECK39-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 24667// CHECK39-NEXT: store ptr null, ptr [[TMP12]], align 44668// CHECK39-NEXT: [[TMP13:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 04669// CHECK39-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 04670// CHECK39-NEXT: [[TMP15:%.*]] = load i32, ptr [[TE]], align 44671// CHECK39-NEXT: [[TMP16:%.*]] = load i32, ptr [[TH]], align 44672// CHECK39-NEXT: [[TMP17:%.*]] = icmp ult i32 [[TMP16]], 14673// CHECK39-NEXT: [[TMP18:%.*]] = select i1 [[TMP17]], i32 [[TMP16]], i32 14674// CHECK39-NEXT: [[TMP19:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP15]], 04675// CHECK39-NEXT: [[TMP20:%.*]] = insertvalue [3 x i32] zeroinitializer, i32 [[TMP18]], 04676// CHECK39-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 04677// CHECK39-NEXT: store i32 3, ptr [[TMP21]], align 44678// CHECK39-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 14679// CHECK39-NEXT: store i32 3, ptr [[TMP22]], align 44680// CHECK39-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 24681// CHECK39-NEXT: store ptr [[TMP13]], ptr [[TMP23]], align 44682// CHECK39-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 34683// CHECK39-NEXT: store ptr [[TMP14]], ptr [[TMP24]], align 44684// CHECK39-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 44685// CHECK39-NEXT: store ptr @.offload_sizes.1, ptr [[TMP25]], align 44686// CHECK39-NEXT: [[TMP26:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 54687// CHECK39-NEXT: store ptr @.offload_maptypes.2, ptr [[TMP26]], align 44688// CHECK39-NEXT: [[TMP27:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 64689// CHECK39-NEXT: store ptr null, ptr [[TMP27]], align 44690// CHECK39-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 74691// CHECK39-NEXT: store ptr null, ptr [[TMP28]], align 44692// CHECK39-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 84693// CHECK39-NEXT: store i64 10, ptr [[TMP29]], align 84694// CHECK39-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 94695// CHECK39-NEXT: store i64 0, ptr [[TMP30]], align 84696// CHECK39-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 104697// CHECK39-NEXT: store [3 x i32] [[TMP19]], ptr [[TMP31]], align 44698// CHECK39-NEXT: [[TMP32:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 114699// CHECK39-NEXT: store [3 x i32] [[TMP20]], ptr [[TMP32]], align 44700// CHECK39-NEXT: [[TMP33:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 124701// CHECK39-NEXT: store i32 0, ptr [[TMP33]], align 44702// CHECK39-NEXT: [[TMP34:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 [[TMP15]], i32 [[TMP18]], ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.region_id, ptr [[KERNEL_ARGS]])4703// CHECK39-NEXT: [[TMP35:%.*]] = icmp ne i32 [[TMP34]], 04704// CHECK39-NEXT: br i1 [[TMP35]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]4705// CHECK39: omp_offload.failed:4706// CHECK39-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181(i32 [[TMP1]], i32 [[TMP3]], ptr [[A]]) #[[ATTR3]]4707// CHECK39-NEXT: br label [[OMP_OFFLOAD_CONT]]4708// CHECK39: omp_offload.cont:4709// CHECK39-NEXT: ret i32 04710//4711//4712// CHECK39-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l1814713// CHECK39-SAME: (i32 noundef [[TE:%.*]], i32 noundef [[TH:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {4714// CHECK39-NEXT: entry:4715// CHECK39-NEXT: [[TE_ADDR:%.*]] = alloca i32, align 44716// CHECK39-NEXT: [[TH_ADDR:%.*]] = alloca i32, align 44717// CHECK39-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 44718// CHECK39-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]])4719// CHECK39-NEXT: store i32 [[TE]], ptr [[TE_ADDR]], align 44720// CHECK39-NEXT: store i32 [[TH]], ptr [[TH_ADDR]], align 44721// CHECK39-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 44722// CHECK39-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 44723// CHECK39-NEXT: [[TMP2:%.*]] = load i32, ptr [[TE_ADDR]], align 44724// CHECK39-NEXT: [[TMP3:%.*]] = load i32, ptr [[TH_ADDR]], align 44725// CHECK39-NEXT: call void @__kmpc_push_num_teams(ptr @[[GLOB2]], i32 [[TMP0]], i32 [[TMP2]], i32 [[TMP3]])4726// CHECK39-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined, ptr [[TMP1]])4727// CHECK39-NEXT: ret void4728//4729//4730// CHECK39-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z5tmainIiLi10EEiT__l181.omp_outlined4731// CHECK39-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR2]] {4732// CHECK39-NEXT: entry:4733// CHECK39-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 44734// CHECK39-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 44735// CHECK39-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 44736// CHECK39-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44737// CHECK39-NEXT: [[TMP:%.*]] = alloca i32, align 44738// CHECK39-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44739// CHECK39-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44740// CHECK39-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 44741// CHECK39-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 44742// CHECK39-NEXT: [[I:%.*]] = alloca i32, align 44743// CHECK39-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 44744// CHECK39-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 44745// CHECK39-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 44746// CHECK39-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 44747// CHECK39-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44748// CHECK39-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44749// CHECK39-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 44750// CHECK39-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 44751// CHECK39-NEXT: [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 44752// CHECK39-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 44753// CHECK39-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP2]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)4754// CHECK39-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44755// CHECK39-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 94756// CHECK39-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]4757// CHECK39: cond.true:4758// CHECK39-NEXT: br label [[COND_END:%.*]]4759// CHECK39: cond.false:4760// CHECK39-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 44761// CHECK39-NEXT: br label [[COND_END]]4762// CHECK39: cond.end:4763// CHECK39-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]4764// CHECK39-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 44765// CHECK39-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44766// CHECK39-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 44767// CHECK39-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4768// CHECK39: omp.inner.for.cond:4769// CHECK39-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP14:![0-9]+]]4770// CHECK39-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP14]]4771// CHECK39-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]4772// CHECK39-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4773// CHECK39: omp.inner.for.body:4774// CHECK39-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP14]]4775// CHECK39-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP8]], 14776// CHECK39-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4777// CHECK39-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP14]]4778// CHECK39-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP14]]4779// CHECK39-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[TMP0]], i32 0, i32 [[TMP9]]4780// CHECK39-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP14]]4781// CHECK39-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4782// CHECK39: omp.body.continue:4783// CHECK39-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4784// CHECK39: omp.inner.for.inc:4785// CHECK39-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP14]]4786// CHECK39-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP10]], 14787// CHECK39-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP14]]4788// CHECK39-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP15:![0-9]+]]4789// CHECK39: omp.inner.for.end:4790// CHECK39-NEXT: br label [[OMP_LOOP_EXIT:%.*]]4791// CHECK39: omp.loop.exit:4792// CHECK39-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])4793// CHECK39-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 44794// CHECK39-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 04795// CHECK39-NEXT: br i1 [[TMP12]], label [[DOTOMP_FINAL_THEN:%.*]], label [[DOTOMP_FINAL_DONE:%.*]]4796// CHECK39: .omp.final.then:4797// CHECK39-NEXT: store i32 10, ptr [[I]], align 44798// CHECK39-NEXT: br label [[DOTOMP_FINAL_DONE]]4799// CHECK39: .omp.final.done:4800// CHECK39-NEXT: ret void4801//4802//4803// CHECK41-LABEL: define {{[^@]+}}@main4804// CHECK41-SAME: (i32 noundef signext [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {4805// CHECK41-NEXT: entry:4806// CHECK41-NEXT: [[RETVAL:%.*]] = alloca i32, align 44807// CHECK41-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44808// CHECK41-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 84809// CHECK41-NEXT: [[N:%.*]] = alloca i32, align 44810// CHECK41-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 84811// CHECK41-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 84812// CHECK41-NEXT: [[TMP:%.*]] = alloca i32, align 44813// CHECK41-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 44814// CHECK41-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 44815// CHECK41-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44816// CHECK41-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44817// CHECK41-NEXT: [[I:%.*]] = alloca i32, align 44818// CHECK41-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44819// CHECK41-NEXT: [[I3:%.*]] = alloca i32, align 44820// CHECK41-NEXT: store i32 0, ptr [[RETVAL]], align 44821// CHECK41-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44822// CHECK41-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 84823// CHECK41-NEXT: store i32 100, ptr [[N]], align 44824// CHECK41-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 44825// CHECK41-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i644826// CHECK41-NEXT: [[TMP2:%.*]] = call ptr @llvm.stacksave.p0()4827// CHECK41-NEXT: store ptr [[TMP2]], ptr [[SAVED_STACK]], align 84828// CHECK41-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 44829// CHECK41-NEXT: store i64 [[TMP1]], ptr [[__VLA_EXPR0]], align 84830// CHECK41-NEXT: [[TMP3:%.*]] = load i32, ptr [[N]], align 44831// CHECK41-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 44832// CHECK41-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 44833// CHECK41-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 04834// CHECK41-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 14835// CHECK41-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 14836// CHECK41-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 44837// CHECK41-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44838// CHECK41-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44839// CHECK41-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 44840// CHECK41-NEXT: store i32 0, ptr [[I]], align 44841// CHECK41-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 44842// CHECK41-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]4843// CHECK41-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]4844// CHECK41: simd.if.then:4845// CHECK41-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44846// CHECK41-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 44847// CHECK41-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4848// CHECK41: omp.inner.for.cond:4849// CHECK41-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]4850// CHECK41-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP2]]4851// CHECK41-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]4852// CHECK41-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4853// CHECK41: omp.inner.for.body:4854// CHECK41-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]4855// CHECK41-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP10]], 14856// CHECK41-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4857// CHECK41-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP2]]4858// CHECK41-NEXT: [[TMP11:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP2]]4859// CHECK41-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP11]] to i644860// CHECK41-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 [[IDXPROM]]4861// CHECK41-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP2]]4862// CHECK41-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4863// CHECK41: omp.body.continue:4864// CHECK41-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4865// CHECK41: omp.inner.for.inc:4866// CHECK41-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]4867// CHECK41-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP12]], 14868// CHECK41-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]4869// CHECK41-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]4870// CHECK41: omp.inner.for.end:4871// CHECK41-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 44872// CHECK41-NEXT: [[SUB6:%.*]] = sub nsw i32 [[TMP13]], 04873// CHECK41-NEXT: [[DIV7:%.*]] = sdiv i32 [[SUB6]], 14874// CHECK41-NEXT: [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 14875// CHECK41-NEXT: [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]4876// CHECK41-NEXT: store i32 [[ADD9]], ptr [[I3]], align 44877// CHECK41-NEXT: br label [[SIMD_IF_END]]4878// CHECK41: simd.if.end:4879// CHECK41-NEXT: [[TMP14:%.*]] = load i32, ptr [[ARGC_ADDR]], align 44880// CHECK41-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP14]])4881// CHECK41-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 44882// CHECK41-NEXT: [[TMP15:%.*]] = load ptr, ptr [[SAVED_STACK]], align 84883// CHECK41-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP15]])4884// CHECK41-NEXT: [[TMP16:%.*]] = load i32, ptr [[RETVAL]], align 44885// CHECK41-NEXT: ret i32 [[TMP16]]4886//4887//4888// CHECK41-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_4889// CHECK41-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR2:[0-9]+]] comdat {4890// CHECK41-NEXT: entry:4891// CHECK41-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44892// CHECK41-NEXT: [[A:%.*]] = alloca [10 x i32], align 44893// CHECK41-NEXT: [[TE:%.*]] = alloca i32, align 44894// CHECK41-NEXT: [[TH:%.*]] = alloca i32, align 44895// CHECK41-NEXT: [[TMP:%.*]] = alloca i32, align 44896// CHECK41-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44897// CHECK41-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44898// CHECK41-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44899// CHECK41-NEXT: [[I:%.*]] = alloca i32, align 44900// CHECK41-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44901// CHECK41-NEXT: store i32 0, ptr [[TE]], align 44902// CHECK41-NEXT: store i32 128, ptr [[TH]], align 44903// CHECK41-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44904// CHECK41-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 44905// CHECK41-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44906// CHECK41-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_IV]], align 44907// CHECK41-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4908// CHECK41: omp.inner.for.cond:4909// CHECK41-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6:![0-9]+]]4910// CHECK41-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP6]]4911// CHECK41-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]4912// CHECK41-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4913// CHECK41: omp.inner.for.body:4914// CHECK41-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]4915// CHECK41-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP3]], 14916// CHECK41-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4917// CHECK41-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP6]]4918// CHECK41-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP6]]4919// CHECK41-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i644920// CHECK41-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[A]], i64 0, i64 [[IDXPROM]]4921// CHECK41-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP6]]4922// CHECK41-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4923// CHECK41: omp.body.continue:4924// CHECK41-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4925// CHECK41: omp.inner.for.inc:4926// CHECK41-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]4927// CHECK41-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP5]], 14928// CHECK41-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP6]]4929// CHECK41-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]4930// CHECK41: omp.inner.for.end:4931// CHECK41-NEXT: store i32 10, ptr [[I]], align 44932// CHECK41-NEXT: ret i32 04933//4934//4935// CHECK43-LABEL: define {{[^@]+}}@main4936// CHECK43-SAME: (i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {4937// CHECK43-NEXT: entry:4938// CHECK43-NEXT: [[RETVAL:%.*]] = alloca i32, align 44939// CHECK43-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 44940// CHECK43-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 44941// CHECK43-NEXT: [[N:%.*]] = alloca i32, align 44942// CHECK43-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 44943// CHECK43-NEXT: [[__VLA_EXPR0:%.*]] = alloca i32, align 44944// CHECK43-NEXT: [[TMP:%.*]] = alloca i32, align 44945// CHECK43-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 44946// CHECK43-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 44947// CHECK43-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 44948// CHECK43-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 44949// CHECK43-NEXT: [[I:%.*]] = alloca i32, align 44950// CHECK43-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 44951// CHECK43-NEXT: [[I3:%.*]] = alloca i32, align 44952// CHECK43-NEXT: store i32 0, ptr [[RETVAL]], align 44953// CHECK43-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 44954// CHECK43-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 44955// CHECK43-NEXT: store i32 100, ptr [[N]], align 44956// CHECK43-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 44957// CHECK43-NEXT: [[TMP1:%.*]] = call ptr @llvm.stacksave.p0()4958// CHECK43-NEXT: store ptr [[TMP1]], ptr [[SAVED_STACK]], align 44959// CHECK43-NEXT: [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 44960// CHECK43-NEXT: store i32 [[TMP0]], ptr [[__VLA_EXPR0]], align 44961// CHECK43-NEXT: [[TMP2:%.*]] = load i32, ptr [[N]], align 44962// CHECK43-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_]], align 44963// CHECK43-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 44964// CHECK43-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 04965// CHECK43-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 14966// CHECK43-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 14967// CHECK43-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 44968// CHECK43-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 44969// CHECK43-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 44970// CHECK43-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_UB]], align 44971// CHECK43-NEXT: store i32 0, ptr [[I]], align 44972// CHECK43-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 44973// CHECK43-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]4974// CHECK43-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]4975// CHECK43: simd.if.then:4976// CHECK43-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_LB]], align 44977// CHECK43-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_IV]], align 44978// CHECK43-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]4979// CHECK43: omp.inner.for.cond:4980// CHECK43-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]4981// CHECK43-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP3]]4982// CHECK43-NEXT: [[CMP4:%.*]] = icmp sle i32 [[TMP7]], [[TMP8]]4983// CHECK43-NEXT: br i1 [[CMP4]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]4984// CHECK43: omp.inner.for.body:4985// CHECK43-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]4986// CHECK43-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP9]], 14987// CHECK43-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]4988// CHECK43-NEXT: store i32 [[ADD]], ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP3]]4989// CHECK43-NEXT: [[TMP10:%.*]] = load i32, ptr [[I3]], align 4, !llvm.access.group [[ACC_GRP3]]4990// CHECK43-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i32 [[TMP10]]4991// CHECK43-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP3]]4992// CHECK43-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]4993// CHECK43: omp.body.continue:4994// CHECK43-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]4995// CHECK43: omp.inner.for.inc:4996// CHECK43-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]4997// CHECK43-NEXT: [[ADD5:%.*]] = add nsw i32 [[TMP11]], 14998// CHECK43-NEXT: store i32 [[ADD5]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]4999// CHECK43-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]5000// CHECK43: omp.inner.for.end:5001// CHECK43-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 45002// CHECK43-NEXT: [[SUB6:%.*]] = sub nsw i32 [[TMP12]], 05003// CHECK43-NEXT: [[DIV7:%.*]] = sdiv i32 [[SUB6]], 15004// CHECK43-NEXT: [[MUL8:%.*]] = mul nsw i32 [[DIV7]], 15005// CHECK43-NEXT: [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]5006// CHECK43-NEXT: store i32 [[ADD9]], ptr [[I3]], align 45007// CHECK43-NEXT: br label [[SIMD_IF_END]]5008// CHECK43: simd.if.end:5009// CHECK43-NEXT: [[TMP13:%.*]] = load i32, ptr [[ARGC_ADDR]], align 45010// CHECK43-NEXT: [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP13]])5011// CHECK43-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 45012// CHECK43-NEXT: [[TMP14:%.*]] = load ptr, ptr [[SAVED_STACK]], align 45013// CHECK43-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP14]])5014// CHECK43-NEXT: [[TMP15:%.*]] = load i32, ptr [[RETVAL]], align 45015// CHECK43-NEXT: ret i32 [[TMP15]]5016//5017//5018// CHECK43-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_5019// CHECK43-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR2:[0-9]+]] comdat {5020// CHECK43-NEXT: entry:5021// CHECK43-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 45022// CHECK43-NEXT: [[A:%.*]] = alloca [10 x i32], align 45023// CHECK43-NEXT: [[TE:%.*]] = alloca i32, align 45024// CHECK43-NEXT: [[TH:%.*]] = alloca i32, align 45025// CHECK43-NEXT: [[TMP:%.*]] = alloca i32, align 45026// CHECK43-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45027// CHECK43-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45028// CHECK43-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45029// CHECK43-NEXT: [[I:%.*]] = alloca i32, align 45030// CHECK43-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 45031// CHECK43-NEXT: store i32 0, ptr [[TE]], align 45032// CHECK43-NEXT: store i32 128, ptr [[TH]], align 45033// CHECK43-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45034// CHECK43-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45035// CHECK43-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45036// CHECK43-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_IV]], align 45037// CHECK43-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5038// CHECK43: omp.inner.for.cond:5039// CHECK43-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP7:![0-9]+]]5040// CHECK43-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP7]]5041// CHECK43-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]5042// CHECK43-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5043// CHECK43: omp.inner.for.body:5044// CHECK43-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP7]]5045// CHECK43-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP3]], 15046// CHECK43-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5047// CHECK43-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP7]]5048// CHECK43-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP7]]5049// CHECK43-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[A]], i32 0, i32 [[TMP4]]5050// CHECK43-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP7]]5051// CHECK43-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5052// CHECK43: omp.body.continue:5053// CHECK43-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5054// CHECK43: omp.inner.for.inc:5055// CHECK43-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP7]]5056// CHECK43-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP5]], 15057// CHECK43-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP7]]5058// CHECK43-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP8:![0-9]+]]5059// CHECK43: omp.inner.for.end:5060// CHECK43-NEXT: store i32 10, ptr [[I]], align 45061// CHECK43-NEXT: ret i32 05062//5063//5064// CHECK45-LABEL: define {{[^@]+}}@main5065// CHECK45-SAME: (i32 noundef signext [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {5066// CHECK45-NEXT: entry:5067// CHECK45-NEXT: [[RETVAL:%.*]] = alloca i32, align 45068// CHECK45-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 45069// CHECK45-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 85070// CHECK45-NEXT: [[N:%.*]] = alloca i32, align 45071// CHECK45-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 85072// CHECK45-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 85073// CHECK45-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 15074// CHECK45-NEXT: [[TMP:%.*]] = alloca i32, align 45075// CHECK45-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 45076// CHECK45-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 45077// CHECK45-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45078// CHECK45-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45079// CHECK45-NEXT: [[I:%.*]] = alloca i32, align 45080// CHECK45-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45081// CHECK45-NEXT: [[I4:%.*]] = alloca i32, align 45082// CHECK45-NEXT: store i32 0, ptr [[RETVAL]], align 45083// CHECK45-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 45084// CHECK45-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 85085// CHECK45-NEXT: store i32 100, ptr [[N]], align 45086// CHECK45-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 45087// CHECK45-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i645088// CHECK45-NEXT: [[TMP2:%.*]] = call ptr @llvm.stacksave.p0()5089// CHECK45-NEXT: store ptr [[TMP2]], ptr [[SAVED_STACK]], align 85090// CHECK45-NEXT: [[VLA:%.*]] = alloca i32, i64 [[TMP1]], align 45091// CHECK45-NEXT: store i64 [[TMP1]], ptr [[__VLA_EXPR0]], align 85092// CHECK45-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARGC_ADDR]], align 45093// CHECK45-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP3]], 05094// CHECK45-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i85095// CHECK45-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 15096// CHECK45-NEXT: [[TMP4:%.*]] = load i32, ptr [[N]], align 45097// CHECK45-NEXT: store i32 [[TMP4]], ptr [[DOTCAPTURE_EXPR_1]], align 45098// CHECK45-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 45099// CHECK45-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP5]], 05100// CHECK45-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 15101// CHECK45-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV]], 15102// CHECK45-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_2]], align 45103// CHECK45-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45104// CHECK45-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 45105// CHECK45-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 45106// CHECK45-NEXT: store i32 0, ptr [[I]], align 45107// CHECK45-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 45108// CHECK45-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]5109// CHECK45-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]5110// CHECK45: simd.if.then:5111// CHECK45-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45112// CHECK45-NEXT: store i32 [[TMP8]], ptr [[DOTOMP_IV]], align 45113// CHECK45-NEXT: [[TMP9:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 15114// CHECK45-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP9]] to i15115// CHECK45-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]5116// CHECK45: omp_if.then:5117// CHECK45-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5118// CHECK45: omp.inner.for.cond:5119// CHECK45-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2:![0-9]+]]5120// CHECK45-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP2]]5121// CHECK45-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP10]], [[TMP11]]5122// CHECK45-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5123// CHECK45: omp.inner.for.body:5124// CHECK45-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]5125// CHECK45-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP12]], 15126// CHECK45-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5127// CHECK45-NEXT: store i32 [[ADD]], ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP2]]5128// CHECK45-NEXT: [[TMP13:%.*]] = load i32, ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP2]]5129// CHECK45-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP13]] to i645130// CHECK45-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 [[IDXPROM]]5131// CHECK45-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP2]]5132// CHECK45-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5133// CHECK45: omp.body.continue:5134// CHECK45-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5135// CHECK45: omp.inner.for.inc:5136// CHECK45-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]5137// CHECK45-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP14]], 15138// CHECK45-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP2]]5139// CHECK45-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]5140// CHECK45: omp.inner.for.end:5141// CHECK45-NEXT: br label [[OMP_IF_END:%.*]]5142// CHECK45: omp_if.else:5143// CHECK45-NEXT: br label [[OMP_INNER_FOR_COND7:%.*]]5144// CHECK45: omp.inner.for.cond7:5145// CHECK45-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45146// CHECK45-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45147// CHECK45-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]5148// CHECK45-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY9:%.*]], label [[OMP_INNER_FOR_END17:%.*]]5149// CHECK45: omp.inner.for.body9:5150// CHECK45-NEXT: [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45151// CHECK45-NEXT: [[MUL10:%.*]] = mul nsw i32 [[TMP17]], 15152// CHECK45-NEXT: [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]5153// CHECK45-NEXT: store i32 [[ADD11]], ptr [[I4]], align 45154// CHECK45-NEXT: [[TMP18:%.*]] = load i32, ptr [[I4]], align 45155// CHECK45-NEXT: [[IDXPROM12:%.*]] = sext i32 [[TMP18]] to i645156// CHECK45-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i64 [[IDXPROM12]]5157// CHECK45-NEXT: store i32 0, ptr [[ARRAYIDX13]], align 45158// CHECK45-NEXT: br label [[OMP_BODY_CONTINUE14:%.*]]5159// CHECK45: omp.body.continue14:5160// CHECK45-NEXT: br label [[OMP_INNER_FOR_INC15:%.*]]5161// CHECK45: omp.inner.for.inc15:5162// CHECK45-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45163// CHECK45-NEXT: [[ADD16:%.*]] = add nsw i32 [[TMP19]], 15164// CHECK45-NEXT: store i32 [[ADD16]], ptr [[DOTOMP_IV]], align 45165// CHECK45-NEXT: br label [[OMP_INNER_FOR_COND7]], !llvm.loop [[LOOP6:![0-9]+]]5166// CHECK45: omp.inner.for.end17:5167// CHECK45-NEXT: br label [[OMP_IF_END]]5168// CHECK45: omp_if.end:5169// CHECK45-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 45170// CHECK45-NEXT: [[SUB18:%.*]] = sub nsw i32 [[TMP20]], 05171// CHECK45-NEXT: [[DIV19:%.*]] = sdiv i32 [[SUB18]], 15172// CHECK45-NEXT: [[MUL20:%.*]] = mul nsw i32 [[DIV19]], 15173// CHECK45-NEXT: [[ADD21:%.*]] = add nsw i32 0, [[MUL20]]5174// CHECK45-NEXT: store i32 [[ADD21]], ptr [[I4]], align 45175// CHECK45-NEXT: br label [[SIMD_IF_END]]5176// CHECK45: simd.if.end:5177// CHECK45-NEXT: [[TMP21:%.*]] = load i32, ptr [[ARGC_ADDR]], align 45178// CHECK45-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z5tmainIiLi10EEiT_(i32 noundef signext [[TMP21]])5179// CHECK45-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 45180// CHECK45-NEXT: [[TMP22:%.*]] = load ptr, ptr [[SAVED_STACK]], align 85181// CHECK45-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP22]])5182// CHECK45-NEXT: [[TMP23:%.*]] = load i32, ptr [[RETVAL]], align 45183// CHECK45-NEXT: ret i32 [[TMP23]]5184//5185//5186// CHECK45-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_5187// CHECK45-SAME: (i32 noundef signext [[ARGC:%.*]]) #[[ATTR2:[0-9]+]] comdat {5188// CHECK45-NEXT: entry:5189// CHECK45-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 45190// CHECK45-NEXT: [[A:%.*]] = alloca [10 x i32], align 45191// CHECK45-NEXT: [[TE:%.*]] = alloca i32, align 45192// CHECK45-NEXT: [[TH:%.*]] = alloca i32, align 45193// CHECK45-NEXT: [[TMP:%.*]] = alloca i32, align 45194// CHECK45-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45195// CHECK45-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45196// CHECK45-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45197// CHECK45-NEXT: [[I:%.*]] = alloca i32, align 45198// CHECK45-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 45199// CHECK45-NEXT: store i32 0, ptr [[TE]], align 45200// CHECK45-NEXT: store i32 128, ptr [[TH]], align 45201// CHECK45-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45202// CHECK45-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45203// CHECK45-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45204// CHECK45-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_IV]], align 45205// CHECK45-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5206// CHECK45: omp.inner.for.cond:5207// CHECK45-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP8:![0-9]+]]5208// CHECK45-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP8]]5209// CHECK45-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]5210// CHECK45-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5211// CHECK45: omp.inner.for.body:5212// CHECK45-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP8]]5213// CHECK45-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP3]], 15214// CHECK45-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5215// CHECK45-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP8]]5216// CHECK45-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP8]]5217// CHECK45-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i645218// CHECK45-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[A]], i64 0, i64 [[IDXPROM]]5219// CHECK45-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP8]]5220// CHECK45-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5221// CHECK45: omp.body.continue:5222// CHECK45-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5223// CHECK45: omp.inner.for.inc:5224// CHECK45-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP8]]5225// CHECK45-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP5]], 15226// CHECK45-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP8]]5227// CHECK45-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP9:![0-9]+]]5228// CHECK45: omp.inner.for.end:5229// CHECK45-NEXT: store i32 10, ptr [[I]], align 45230// CHECK45-NEXT: ret i32 05231//5232//5233// CHECK47-LABEL: define {{[^@]+}}@main5234// CHECK47-SAME: (i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {5235// CHECK47-NEXT: entry:5236// CHECK47-NEXT: [[RETVAL:%.*]] = alloca i32, align 45237// CHECK47-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 45238// CHECK47-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 45239// CHECK47-NEXT: [[N:%.*]] = alloca i32, align 45240// CHECK47-NEXT: [[SAVED_STACK:%.*]] = alloca ptr, align 45241// CHECK47-NEXT: [[__VLA_EXPR0:%.*]] = alloca i32, align 45242// CHECK47-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i8, align 15243// CHECK47-NEXT: [[TMP:%.*]] = alloca i32, align 45244// CHECK47-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 45245// CHECK47-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 45246// CHECK47-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45247// CHECK47-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45248// CHECK47-NEXT: [[I:%.*]] = alloca i32, align 45249// CHECK47-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45250// CHECK47-NEXT: [[I4:%.*]] = alloca i32, align 45251// CHECK47-NEXT: store i32 0, ptr [[RETVAL]], align 45252// CHECK47-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 45253// CHECK47-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 45254// CHECK47-NEXT: store i32 100, ptr [[N]], align 45255// CHECK47-NEXT: [[TMP0:%.*]] = load i32, ptr [[N]], align 45256// CHECK47-NEXT: [[TMP1:%.*]] = call ptr @llvm.stacksave.p0()5257// CHECK47-NEXT: store ptr [[TMP1]], ptr [[SAVED_STACK]], align 45258// CHECK47-NEXT: [[VLA:%.*]] = alloca i32, i32 [[TMP0]], align 45259// CHECK47-NEXT: store i32 [[TMP0]], ptr [[__VLA_EXPR0]], align 45260// CHECK47-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARGC_ADDR]], align 45261// CHECK47-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP2]], 05262// CHECK47-NEXT: [[STOREDV:%.*]] = zext i1 [[TOBOOL]] to i85263// CHECK47-NEXT: store i8 [[STOREDV]], ptr [[DOTCAPTURE_EXPR_]], align 15264// CHECK47-NEXT: [[TMP3:%.*]] = load i32, ptr [[N]], align 45265// CHECK47-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_1]], align 45266// CHECK47-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 45267// CHECK47-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP4]], 05268// CHECK47-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 15269// CHECK47-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV]], 15270// CHECK47-NEXT: store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_2]], align 45271// CHECK47-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45272// CHECK47-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 45273// CHECK47-NEXT: store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 45274// CHECK47-NEXT: store i32 0, ptr [[I]], align 45275// CHECK47-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 45276// CHECK47-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP6]]5277// CHECK47-NEXT: br i1 [[CMP]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END:%.*]]5278// CHECK47: simd.if.then:5279// CHECK47-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45280// CHECK47-NEXT: store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 45281// CHECK47-NEXT: [[TMP8:%.*]] = load i8, ptr [[DOTCAPTURE_EXPR_]], align 15282// CHECK47-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP8]] to i15283// CHECK47-NEXT: br i1 [[LOADEDV]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]5284// CHECK47: omp_if.then:5285// CHECK47-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5286// CHECK47: omp.inner.for.cond:5287// CHECK47-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3:![0-9]+]]5288// CHECK47-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP3]]5289// CHECK47-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP9]], [[TMP10]]5290// CHECK47-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5291// CHECK47: omp.inner.for.body:5292// CHECK47-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]5293// CHECK47-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP11]], 15294// CHECK47-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5295// CHECK47-NEXT: store i32 [[ADD]], ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP3]]5296// CHECK47-NEXT: [[TMP12:%.*]] = load i32, ptr [[I4]], align 4, !llvm.access.group [[ACC_GRP3]]5297// CHECK47-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i32 [[TMP12]]5298// CHECK47-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP3]]5299// CHECK47-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5300// CHECK47: omp.body.continue:5301// CHECK47-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5302// CHECK47: omp.inner.for.inc:5303// CHECK47-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]5304// CHECK47-NEXT: [[ADD6:%.*]] = add nsw i32 [[TMP13]], 15305// CHECK47-NEXT: store i32 [[ADD6]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP3]]5306// CHECK47-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]5307// CHECK47: omp.inner.for.end:5308// CHECK47-NEXT: br label [[OMP_IF_END:%.*]]5309// CHECK47: omp_if.else:5310// CHECK47-NEXT: br label [[OMP_INNER_FOR_COND7:%.*]]5311// CHECK47: omp.inner.for.cond7:5312// CHECK47-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45313// CHECK47-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 45314// CHECK47-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP14]], [[TMP15]]5315// CHECK47-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY9:%.*]], label [[OMP_INNER_FOR_END16:%.*]]5316// CHECK47: omp.inner.for.body9:5317// CHECK47-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45318// CHECK47-NEXT: [[MUL10:%.*]] = mul nsw i32 [[TMP16]], 15319// CHECK47-NEXT: [[ADD11:%.*]] = add nsw i32 0, [[MUL10]]5320// CHECK47-NEXT: store i32 [[ADD11]], ptr [[I4]], align 45321// CHECK47-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 45322// CHECK47-NEXT: [[ARRAYIDX12:%.*]] = getelementptr inbounds i32, ptr [[VLA]], i32 [[TMP17]]5323// CHECK47-NEXT: store i32 0, ptr [[ARRAYIDX12]], align 45324// CHECK47-NEXT: br label [[OMP_BODY_CONTINUE13:%.*]]5325// CHECK47: omp.body.continue13:5326// CHECK47-NEXT: br label [[OMP_INNER_FOR_INC14:%.*]]5327// CHECK47: omp.inner.for.inc14:5328// CHECK47-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 45329// CHECK47-NEXT: [[ADD15:%.*]] = add nsw i32 [[TMP18]], 15330// CHECK47-NEXT: store i32 [[ADD15]], ptr [[DOTOMP_IV]], align 45331// CHECK47-NEXT: br label [[OMP_INNER_FOR_COND7]], !llvm.loop [[LOOP7:![0-9]+]]5332// CHECK47: omp.inner.for.end16:5333// CHECK47-NEXT: br label [[OMP_IF_END]]5334// CHECK47: omp_if.end:5335// CHECK47-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 45336// CHECK47-NEXT: [[SUB17:%.*]] = sub nsw i32 [[TMP19]], 05337// CHECK47-NEXT: [[DIV18:%.*]] = sdiv i32 [[SUB17]], 15338// CHECK47-NEXT: [[MUL19:%.*]] = mul nsw i32 [[DIV18]], 15339// CHECK47-NEXT: [[ADD20:%.*]] = add nsw i32 0, [[MUL19]]5340// CHECK47-NEXT: store i32 [[ADD20]], ptr [[I4]], align 45341// CHECK47-NEXT: br label [[SIMD_IF_END]]5342// CHECK47: simd.if.end:5343// CHECK47-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARGC_ADDR]], align 45344// CHECK47-NEXT: [[CALL:%.*]] = call noundef i32 @_Z5tmainIiLi10EEiT_(i32 noundef [[TMP20]])5345// CHECK47-NEXT: store i32 [[CALL]], ptr [[RETVAL]], align 45346// CHECK47-NEXT: [[TMP21:%.*]] = load ptr, ptr [[SAVED_STACK]], align 45347// CHECK47-NEXT: call void @llvm.stackrestore.p0(ptr [[TMP21]])5348// CHECK47-NEXT: [[TMP22:%.*]] = load i32, ptr [[RETVAL]], align 45349// CHECK47-NEXT: ret i32 [[TMP22]]5350//5351//5352// CHECK47-LABEL: define {{[^@]+}}@_Z5tmainIiLi10EEiT_5353// CHECK47-SAME: (i32 noundef [[ARGC:%.*]]) #[[ATTR2:[0-9]+]] comdat {5354// CHECK47-NEXT: entry:5355// CHECK47-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 45356// CHECK47-NEXT: [[A:%.*]] = alloca [10 x i32], align 45357// CHECK47-NEXT: [[TE:%.*]] = alloca i32, align 45358// CHECK47-NEXT: [[TH:%.*]] = alloca i32, align 45359// CHECK47-NEXT: [[TMP:%.*]] = alloca i32, align 45360// CHECK47-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 45361// CHECK47-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 45362// CHECK47-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 45363// CHECK47-NEXT: [[I:%.*]] = alloca i32, align 45364// CHECK47-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 45365// CHECK47-NEXT: store i32 0, ptr [[TE]], align 45366// CHECK47-NEXT: store i32 128, ptr [[TH]], align 45367// CHECK47-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 45368// CHECK47-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 45369// CHECK47-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTOMP_LB]], align 45370// CHECK47-NEXT: store i32 [[TMP0]], ptr [[DOTOMP_IV]], align 45371// CHECK47-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]5372// CHECK47: omp.inner.for.cond:5373// CHECK47-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP9:![0-9]+]]5374// CHECK47-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !llvm.access.group [[ACC_GRP9]]5375// CHECK47-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]]5376// CHECK47-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]5377// CHECK47: omp.inner.for.body:5378// CHECK47-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP9]]5379// CHECK47-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP3]], 15380// CHECK47-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]5381// CHECK47-NEXT: store i32 [[ADD]], ptr [[I]], align 4, !llvm.access.group [[ACC_GRP9]]5382// CHECK47-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !llvm.access.group [[ACC_GRP9]]5383// CHECK47-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[A]], i32 0, i32 [[TMP4]]5384// CHECK47-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !llvm.access.group [[ACC_GRP9]]5385// CHECK47-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]5386// CHECK47: omp.body.continue:5387// CHECK47-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]5388// CHECK47: omp.inner.for.inc:5389// CHECK47-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP9]]5390// CHECK47-NEXT: [[ADD1:%.*]] = add nsw i32 [[TMP5]], 15391// CHECK47-NEXT: store i32 [[ADD1]], ptr [[DOTOMP_IV]], align 4, !llvm.access.group [[ACC_GRP9]]5392// CHECK47-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP10:![0-9]+]]5393// CHECK47: omp.inner.for.end:5394// CHECK47-NEXT: store i32 10, ptr [[I]], align 45395// CHECK47-NEXT: ret i32 05396//5397